有人能解释一下为什么当 "string" 与 "%d" 格式说明符一起使用时它会给出奇怪的输出

can someone explain me why when a "string" is used with the "%d" fromat specifier it gives strange output

程序如下:

#include <stdio.h>
main()
{
  printf("%d", "A"); // Can i know what the output from "printf" even means why the output is so strange

} // this outputs: "4214884" in my compiler

如您所见,输出结果很奇怪,谁能给我解释一下。这是未定义的行为吗? C standard 中是否描述了这种行为,以便我可以阅读它

是的,这个undefined behaviour%d要求参数是整数,这里传递的是字符串字面量的第一个元素的地址,是指针类型。

根据 C11chapter 7.21.6.1/P9

[...]If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

也就是说,对于托管环境,main() 应该是 int main(void)

如果要打印带有 %d 说明符的字符,请在字符周围加上单引号而不是双引号。

printf("%d", 'A');

这将打印 65,A 的 ASCII 值。

如果您将任何内容放在双引号内,将被解释为 string literal。因此,它有两个字符(在您的情况下),一个是 'A',第二个是 '[=14=]' 字符,您正在使用 %d 说明符打印它,这将完全产生 undefined behaviour .这将在不同的编译器和 IDE 上显示不同的结果。

如果要打印 "A",我的意思是使用双引号,请改用 %s 标识符。