为什么EOF与有效的char值一致?

时间:2016-09-27 08:40:22

标签: c char type-conversion

正如对此问题答案的评论所述: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

如何解释这个矛盾?

1 个答案:

答案 0 :(得分:2)

int值与char值进行比较时,char值为promotedint值。此促销是自动的,是C语言规范的一部分(参见例如this "Usual arithmetic conversions" reference,尤其是第4点)。当然编译器可能会对它发出警告,但如果它是一个有效的语言结构,它为什么要这样做呢?

还有char的签名问题,即实现定义。如果char未签名,则您的情况将为假。

此外,如果您只读取有关从文件中读取字符的函数的任何参考(例如this one for fgetc and getc),您会看到它们返回int而不是char,正是为了上面提到的原因。