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