c++ - 为什么编译器在 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 中,任何比 an 窄的参数在传递给 时int
会自动提升为 an ,或者通常在传递给声明中对应的参数的任何函数或没有参数原型(用 声明)的任何函数时自动提升。C++ Insights 明确向您展示了此促销活动。int
printf
...
()
尽管%c
转换说明符打印一个字符,但它希望在int
参数中接收该字符。
晋升的原因主要是历史原因;C 语言是在本地寄存器大小的计算很容易并且为其他类型实现特定语义需要更多工作的环境中开发的。int
因此,在大多数表达式中,比提升为更窄的整数int
。
推荐阅读
- dart - Flutter 侧抽屉作为一个小部件
- java - 通过搜索子值firebase android获取列表中的uid
- wpf - 基于单元格的DataGrid行背景包含值WPF
- javascript - 错误:不再支持 Buffer.write(string, encoding, offset[, length])
- git - SSH : git 特殊存储库
- javascript - 如何找到 unicode 组合?
- javascript - TypeError: Object(...) 不是 react-redux 中的函数
- css - 具有绝对位置的居中子级与具有显示 flex 的父级
- opencv - 3d 点投影 2d 点错误
- spring - 骆驼 cxf 肥皂和 karaf 问题