我正在使用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
。