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

Vik*_*esh 4 c

引用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数据类型.到底是怎么回事?任何人都可以用位和有符号值来解释?

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

APr*_*mer 8

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

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


Oli*_*rth 4

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

它看起来工作正常的原因是因为char它可能signed在您的平台上,所以它仍然能够代表-1.

  • 在“char”是无符号类型的平台上,表达式“c != EOF”始终为真。 (2认同)
  • @Vikesh,“putchar”将其输入字符转换为“无符号字符”并写入结果。因此,-127 和 129 在 8 位字符实现中确实被转换为相同的字符。 (2认同)