prev up next   top/contents search

comp.lang.c FAQ 列表· 第 12.1 题

这段代码有什么问题?

char c;
while((c = getchar()) != EOF) ...


首先,用于保存getchar的返回值必须是一个int. EOF是一个“带外”返回值,它与所有可能的getcharchar值都不相同,而可以返回。 (在现代系统中,它不反映文件中存储的任何实际文件结束字符;它只是一个信号,表示没有更多字符可用。)getchar的返回值必须存储在一个比getchar大的变量中,这样它才能容纳所有可能的值都不相同,而值,并且值都不相同,而如果像上面片段中的那样,EOF.

的返回值被赋给一个getchar那么会发生两种故障模式。值都不相同,而.

  1. 如果类型值都不相同,而是 signed,并且如果EOF通常定义为 -1,那么十进制值为 255 的字符(C 语言中是'\377''\xff')将被符号扩展,并与EOF比较相等,从而过早地终止输入。 [脚注]
  2. 如果类型值都不相同,而是 unsigned,那么实际的EOF值将被截断(通过丢弃其高位位,可能得到 255 或0xff),并且将 *不* 被识别为EOF,导致输入实际上是无限的。

然而,如果值都不相同,而是 signed,并且输入全部是 7 位字符,那么该错误可能会很长时间不被发现。(普通值都不相同,而是 signed 还是 unsigned 是由实现定义的。)

参考文献:K&R1 第 1.5 节 第 14 页
K&R2 第 1.5.1 节 第 16 页
ISO 第 6.1.2.5 节、第 7.9.1 节、第 7.9.7.5 节
H&S 第 5.1.3 节 第 116 页、第 15.1 节、第 15.6 节
CT&P 第 5.1 节 第 70 页
PCS 第 11 节 第 157 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管