与EOF比较时,使用int作为字符类型

引用Kernighan和Ritchie的“C编程语言”第16页 –

#include main() { int c; c = getchar(); while(c!=EOF) { putchar(c); c = getchar(); } getchar(); return 0; } 

char类型专门用于存储这样的字符数据,但可以使用任何整数类型。我们使用int是一个微妙但重要的原因。问题在于区分输入的结尾和有效数据。解决方案是getchar返回当没有更多输入时,一个独特的值,一个不能与任何真实字符混淆的值。这个值称为EOF ,用于“文件结束”。我们必须声明c是一个足够大的类型,可以保存任何getchar值返回。我们不能使用char因为除了任何可能的char之外, c必须足够大以容纳EOF 。因此我们使用int 。“。

我在stdio.h中查了一下,它说#define EOF (-1)

本书最后说明不能使用char而这个程序“工作正常”(参见EDIT), c也是char数据类型。 到底是怎么回事? 任何人都可以用比特和有符号值来解释?

编辑:
正如Oli在答案中提到的,该程序无法区分EOF255 。 所以它不会很好。 我想知道发生了什么 – 你是说当我们进行比较c!= EOF时,EOF值被转换为char值= 255(二进制的11111111;即用2的补码写的EOF的0到7位符号)?

你的程序运行不正常; 它无法区分EOF255

它似乎正常工作的原因是因为char可能在您的平台上signed ,所以它仍然能够表示-1

getchar结果是输入字符转换为unsigned char然后转换为intEOF即它将在-1 – 255范围内,即257个不同的值,如果不合并其中两个,则不能将其放入8位char中。 实际上你要么将EOF误认为是有效字符(如果char是无符号就会发生),或者将另一个字符误认为EOF (如果char被签名则会发生)。

注意:我假设一个8位char类型,我知道这个假设没有标准支持,它只是目前最常见的实现选择。