使用一个长变量来存储一个字符并打印出来。

问题描述 投票:0回答:2

我正在存储一个 char 在...中 long 变量,并试图用 printf.

long a = 'A';
printf("%c \n",a);

考虑到 默认参数促销 论点会被提升到 int 但作为 long 高过 int 不应升格为 int.

现在,如果它不被提升到 int 在 printf 语句中,是不是有一个类型不匹配,因为我们试图打印一个 long 使用 %c. 根据C标准,这种行为应该是未定义的,但编译器却完美地打印了 A 作为输出,没有任何错误或警告。为什么会这样?

我正在使用GCC代码块编译器。

c printf long-integer type-mismatch integer-promotion
2个回答
2
投票

根据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.

相关的:

促销活动: https:/stackoverflow.coma 460732966699433

未定义行为。https:/stackoverflow.coma41051236699433。


0
投票

ASCII值'A'被转换为一个长数字存储,printf函数将其转换为char,就像%c一样,并打印回'A'。

其实,'A'只是一个数字,它的定义是规范的,所以应该没有问题。

如果我说的不对,请指正。

© www.soinside.com 2019 - 2024. All rights reserved.