为什么这个 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 类型。)

如果 charunsigned 那么您将得到 int 的最低有效 CHAR_BIT 位作为最终结果。如果 charsigned,那么 intchar 的转换行为将由实现定义。

在您的例子中,常数值似乎是 '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,而不是零。