gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:16:01 26 4
gpt4 key购买 nike

我正在使用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, '\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 中,任何比 int 窄的参数在传递给 printf 时都会自动提升为 int,或者通常传递给任何function 对应于声明中的 ... 的参数或任何没有参数原型(prototype)的函数(用 () 声明)。 C++ Insights 明确向您展示了此促销事件。

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

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

关于c++ - 为什么编译器在 printf 中将 char 转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67163712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com