我正在存储一个 char
在...中 long
变量,并试图用 printf
.
long a = 'A';
printf("%c \n",a);
考虑到 默认参数促销 论点会被提升到 int
但作为 long
高过 int
不应升格为 int
.
现在,如果它不被提升到 int
在 printf 语句中,是不是有一个类型不匹配,因为我们试图打印一个 long
使用 %c
. 根据C标准,这种行为应该是未定义的,但编译器却完美地打印了 A
作为输出,没有任何错误或警告。为什么会这样?
我正在使用GCC代码块编译器。
根据C标准,这种行为应该是未定义的,但编译器却完美地将A打印出来,没有任何错误或警告。为什么会这样?
未定义的行为意味着该行为没有被定义。这意味着你不能真正期望它以某种方式表现。有些事情比其他事情更有可能发生,但UB基本上意味着任何事情都可能发生。
另外,你没有收到警告的原因是你没有激活警告。
$ gcc -Wall main.c
main.c: In function ‘main’:
main.c:6:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
6 | printf("%c \n",a);
| ~^ ~
| | |
| int long int
| %ld
我建议你在编译时使用 -Wall -Wextra -pedantic -std=c11 -Werror
请注意,警告说 format ‘%c’ expects argument of type ‘int’
遂过 int
到 %c
是完全可以的。如果你通过一个 char
它将被提升为 int
.
相关的:
ASCII值'A'被转换为一个长数字存储,printf函数将其转换为char,就像%c一样,并打印回'A'。
其实,'A'只是一个数字,它的定义是规范的,所以应该没有问题。
如果我说的不对,请指正。