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

时间:2011-12-11 12:39:56

标签: c

引用Kernighan和Ritchie的C编程语言'第16页 -

#include<stdio.h>

main()
{
int c;
c = getchar();

while(c!=EOF)
{
    putchar(c);
    c = getchar();
} 

getchar();
return 0;
}

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

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

这本书最后说明char不能使用,而这个程序&#34;工作得很好&#34; (请参阅编辑),c作为char数据类型。到底是怎么回事?任何人都可以用位和有符号值来解释?

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

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