正如对此问题答案的评论所述:Why gcc does not produce type mismatch warning for int and char?
-1和255都是0xFF,作为任何当前CPU上的8位十六进制数。
但EOF等于-1。这是一个矛盾,因为EOF的值必须与任何有效的8位字符不一致。这个例子说明了它:
#include <stdio.h>
int main(void)
{
char c = 255;
if (c == EOF) printf("oops\n");
return 0;
}
在我的机器上打印oops
。
如何解释这个矛盾?
答案 0 :(得分:2)
将int
值与char
值进行比较时,char
值为promoted至int
值。此促销是自动的,是C语言规范的一部分(参见例如this "Usual arithmetic conversions" reference,尤其是第4点)。当然编译器可能会对它发出警告,但如果它是一个有效的语言结构,它为什么要这样做呢?
还有char
的签名问题,即实现定义。如果char
未签名,则您的情况将为假。
此外,如果您只读取有关从文件中读取字符的函数的任何参考(例如this one for fgetc
and getc
),您会看到它们返回int
而不是char
,正是为了上面提到的原因。