有人能解释一下为什么当 "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
要求参数是整数,这里传递的是字符串字面量的第一个元素的地址,是指针类型。
根据 C11
、chapter 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
标识符。
程序如下:
#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
要求参数是整数,这里传递的是字符串字面量的第一个元素的地址,是指针类型。
根据 C11
、chapter 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
标识符。