引用Kernighan和Ritchie的“C编程语言”第16页-
#include<stdio.h>
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
不能被使用,而这个程序“工作得很好”(参见编辑),c
作为char
数据类型。怎么一回事?有人能用位和有符号的值来解释吗?
编辑:
正如Oli在回答中提到的那样,程序无法区分EOF
和255
。所以它不能正常工作。我想知道发生了什么--你是说当我们比较c!=EOF时,EOF值被转换为char值= 255 (二进制数为11111111;即用2的补码表示法写入EOF的0到7位)?
发布于 2011-12-11 04:41:17
您的程序不能正常工作;它无法区分EOF
和255
。
它看起来工作正常的原因是因为char
可能在您的平台上是signed
,所以它仍然能够表示-1
。
发布于 2011-12-11 04:50:03
getchar
结果是转换为unsigned char
,然后转换为int
或EOF
的输入字符,即它将在-1-255范围内,即257个不同的值,如果不合并其中两个值,就不能将其放入8位char
中。实际上,您可能会将EOF
误认为是有效字符(如果char
没有签名就会发生这种情况),或者将另一个字符误认为是EOF
(如果对char
进行签名,则会发生这种情况)。
注意:我假设一个8位的char
类型,我知道这个假设不是标准支持的,它只是目前为止最常见的实现选择。
https://stackoverflow.com/questions/8464030
复制