首页 > 解决方案 > 为什么编译器在 printf 中将 char 转换为 int?

问题描述

我正在使用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 是一个基于 clang 的工具,可以进行源到源的转换。它的目标是让事情可见,这通常是有意在幕后发生的。这是关于编译器为我们使事情正常工作所做的魔法。或者查看编译器的类。

这是生成的代码,这是编译器查看代码的方式

#include <cstdio>

int main()
{
  const char arr[10] = {2, 4, 6, 8, '\0', '\0', '\0', '\0', '\0', '\0'};
  {
    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));
    }
  }
}

我的问题是,为什么要使用static_cast<int>即使%c

标签: c++implicit-conversion

解决方案


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

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

晋升的原因主要是历史原因;C 语言是在本地寄存器大小的计算很容易并且为其他类型实现特定语义需要更多工作的环境中开发的。int因此,在大多数表达式中,比提升为更窄的整数int


推荐阅读