为什么这个 C 程序打印字符 2?
Why does this C program print the character 2?
int main(void)
{
char c='012';
printf("%c",c);
return 0;
}
为什么要打印 2?
'012'
是一个多字符常量,它是 int
类型,但具有 实现定义的 值。 (为避免疑义,'0'
也是 C 语言中的 int
类型。)
如果 char
是 unsigned
那么您将得到 int
的最低有效 CHAR_BIT
位作为最终结果。如果 char
是 signed
,那么 int
到 char
的转换行为将由实现定义。
在您的例子中,常数值似乎是 '0' * 256 * 256 + '1' * 256 + '2'
,将其转换为 char
实际上是将结果取模 256。
一般是错误,应该修复。看看当我用 -Wall
选项编译它时会出现什么:
gonczor@wiktor-papu:~/tmp$ gcc test.c -Wall -o test
test.c: In function ‘main’:
test.c:5:12: warning: multi-character character constant [-Wmultichar]
char c='012';
^~~~~
test.c:5:12: warning: overflow in implicit constant conversion [-Woverflow]
gonczor@wiktor-papu:~/tmp$ ./main
31221344gonczor@wiktor-papu:~/tmp$ echo $?
1
最后一行echo $?
打印最后一个命令退出状态。你可以看到它是 1,而不是零。
int main(void)
{
char c='012';
printf("%c",c);
return 0;
}
为什么要打印 2?
'012'
是一个多字符常量,它是 int
类型,但具有 实现定义的 值。 (为避免疑义,'0'
也是 C 语言中的 int
类型。)
如果 char
是 unsigned
那么您将得到 int
的最低有效 CHAR_BIT
位作为最终结果。如果 char
是 signed
,那么 int
到 char
的转换行为将由实现定义。
在您的例子中,常数值似乎是 '0' * 256 * 256 + '1' * 256 + '2'
,将其转换为 char
实际上是将结果取模 256。
一般是错误,应该修复。看看当我用 -Wall
选项编译它时会出现什么:
gonczor@wiktor-papu:~/tmp$ gcc test.c -Wall -o test
test.c: In function ‘main’:
test.c:5:12: warning: multi-character character constant [-Wmultichar]
char c='012';
^~~~~
test.c:5:12: warning: overflow in implicit constant conversion [-Woverflow]
gonczor@wiktor-papu:~/tmp$ ./main
31221344gonczor@wiktor-papu:~/tmp$ echo $?
1
最后一行echo $?
打印最后一个命令退出状态。你可以看到它是 1,而不是零。