为什么这个C程序会打印字符2?

为什么这个C程序会打印字符2?,c,printf,character,literals,C,Printf,Character,Literals,为什么要打印2?'012'是一个多字符常量,它是一个int类型,但有一个实现定义的值。为避免疑问,“0”在C中也是int类型 如果char是无符号的,那么您将得到该int的最低有效字符位作为最终结果。如果char是有符号的,那么将该int转换为char的行为将由实现定义 在您的例子中,常量值似乎是“0”*256*256+“1”*256+“2”,而将其转换为字符实际上是取结果的模256。这通常是一个错误,应该予以纠正。看看当我使用-Wall选项编译它时会出现什么结果: 最后一行echo$?打印最后

为什么要打印2?

'012'是一个多字符常量,它是一个int类型,但有一个实现定义的值。为避免疑问,“0”在C中也是int类型

如果char是无符号的,那么您将得到该int的最低有效字符位作为最终结果。如果char是有符号的,那么将该int转换为char的行为将由实现定义


在您的例子中,常量值似乎是“0”*256*256+“1”*256+“2”,而将其转换为字符实际上是取结果的模256。

这通常是一个错误,应该予以纠正。看看当我使用-Wall选项编译它时会出现什么结果:


最后一行echo$?打印最后一个命令退出状态。您可以看到它是1,而不是零。

首先修复警告,我确信您会收到警告。然后回来。char c='012'在这里是错误的。您想使用一个字符一个数字/字母还是一个字符数组多个数字/字母?@machine\u 1该问题已被迁移。评论来自CSSE@eugene啊,我不知道注释也会被迁移。@MemAllox,您指出的语句不太可能是预期的,但从无效的意义上讲,它并没有错。我没有收到任何警告,只有一个值可以存储在一个字符变量中,就像在一个小的endian机器中一样,只考虑最后一个字节,对吗?@好奇:绝对不。@好奇,如果你没有收到警告,那么你应该提高警告级别或找到更好的编译器。任何值得使用的编译器都会对多字符整型字符常量发出警告。
int main(void)   
{  
    char c='012';  
    printf("%c",c);  
    return 0;  
}  
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