与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在答案中提到的,该程序无法区分EOF
和255
。 所以它不会很好。 我想知道发生了什么 – 你是说当我们进行比较c!= EOF时,EOF值被转换为char值= 255(二进制的11111111;即用2的补码写的EOF的0到7位符号)?
你的程序运行不正常; 它无法区分EOF
和255
。
它似乎正常工作的原因是因为char
可能在您的平台上signed
,所以它仍然能够表示-1
。
getchar
结果是输入字符转换为unsigned char
然后转换为int
或EOF
即它将在-1 – 255范围内,即257个不同的值,如果不合并其中两个,则不能将其放入8位char
中。 实际上你要么将EOF
误认为是有效字符(如果char
是无符号就会发生),或者将另一个字符误认为EOF
(如果char
被签名则会发生)。
注意:我假设一个8位char
类型,我知道这个假设没有标准支持,它只是目前最常见的实现选择。