为什么编译器在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=%cn", c);
}
}

关于cppnights

C++Insights是一个基于clang的工具,可以进行源代码到源代码的转换。它的目标是让事情变得可见,这通常是故意在幕后发生的。这是关于编译器为我们使事情正常工作所做的魔法。或者浏览编译器的类。

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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新