为什么编译器在 printf 中将 char 转换为 int?

Why is compiler converting char to int in printf?

我正在使用 https://cppinsights.io/。以下是代码(默认示例)

#include <cstdio>

int main()
{
    const char arr[10]{2,4,6,8};
    for(const char& c : arr)
    {
      printf("c=%c\n", c);
    }
}

关于 cppinsights

C++ Insights is a clang-based tool which does a source to source transformation. Its goal is to make things visible, which normally and intentionally happen behind the scenes. It's about the magic the compiler does for us to make things work. Or looking through the classes of a compiler.

这是生成的代码,编译器是这样看代码的

#include <cstdio>

int main()
{
  const char arr[10] = {2, 4, 6, 8, '[=11=]', '[=11=]', '[=11=]', '[=11=]', '[=11=]', '[=11=]'};
  {
    char const (&__range1)[10] = arr;
    const char * __begin1 = __range1;
    const char * __end1 = __range1 + 10L;
    for(; __begin1 != __end1; ++__begin1) {
      const char & c = *__begin1;
      printf("c=%c\n", static_cast<int>(c));
    }
  }
}

我的问题是,为什么使用了 %c 却还有 static_cast<int>

在 C 中,任何比 int 窄的参数在传递给 printf 时会自动提升为 int,或者通常在传递给与 [ 相对应的参数的任何函数时=13=] 在声明中或任何没有参数原型的函数(用 () 声明)。 C++ Insights 明确向您展示了此促销活动。

虽然 %c 转换说明符打印一个字符,但它希望在 int 参数中接收该字符。

晋升的原因很大程度上是历史原因; C 是在以本机寄存器大小进行计算很容易并且为其他类型实现特定语义需要更多工作的环境中开发的。因此,在大多数表达式中,小于 int 的整数被提升为 int.