引用Kernighan和Ritchie的"C编程语言"第16页 -
#include<stdio.h>
main()
{
int c;
c = getchar();
while(c!=EOF)
{
putchar(c);
c = getchar();
}
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
"该类型char专门用于存储此类字符数据,但可以使用任何整数类型.我们使用int了一个微妙但重要的原因.问题是区分输入的结尾和有效数据.解决方案是getchar返回一个独特的值当没有更多的输入时,一个不能与任何真实字符混淆的值.这个值被称为EOF"文件结束".我们必须声明c一个足够大的类型来保存任何getchar返回的值.我们不能char因为使用c必须足够大EOF,除了任何可能之外char.因此我们使用int."
它说,我在stdio.h中查了一下 #define EOF (-1)
这本书最后说明char不能使用,而这个程序"工作正常"(参见编辑)也c作为char数据类型.到底是怎么回事?任何人都可以用位和有符号值来解释?
编辑:
正如奥利在答案中提到的,该程序无法区分EOF和255.所以它不会很好.我想知道发生了什么 - 你是说当我们进行比较c!= EOF时,EOF值被转换为char值= 255(二进制的11111111;即用2的补码写的EOF的0到7位符号)?
getchar结果是输入字符转换为unsigned char然后到int或者EOF它将在-1 - 255范围内,即257个不同的值,你不能将它放在8位char而不合并其中两个.实际上你要么误认为EOF是一个有效的角色(如果char是无符号就会发生),或者将另一个角色误认为EOF(如果char签名就会发生).
注意:我假设是8位char类型,我知道这个假设没有标准备份,它只是目前最常见的实现选择.
你的程序运行不正常;它将无法区分EOF和255。
它看起来工作正常的原因是因为char它可能signed在您的平台上,所以它仍然能够代表-1.