引自 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
since c
一定很大
足以容纳EOF
除了任何可能的char
。因此我们
使用int
.".
我查了一下 stdio.h,它说#define EOF (-1)
该书最后指出char
无法使用,而该程序“工作得很好”(参见编辑)c
as char
数据类型也是如此。到底是怎么回事?谁能用位和符号值来解释?
EDIT:
正如奥利在回答中提到的,程序无法区分EOF
and 255
。所以它不会正常工作。我想知道发生了什么 - 你是说当我们进行比较 c!=EOF 时,EOF 值被转换为 char 值 = 255(二进制为 11111111;即以 2 的补码形式写入时 EOF 的位 0 到 7)符号)?
getchar
结果是输入字符转换为unsigned char
然后到int
or EOF
即它将在 -1 - 255 范围内,这是 257 个不同的值,你不能将其放入 8 位中char
而不合并其中两个。实际上你要么会错EOF
作为一个有效的字符(如果char
是无符号的)或者会将另一个字符误认为EOF
(如果发生这种情况char
已签署)。
注意:我假设是8位char
类型,我知道这个假设没有得到标准的支持,它只是迄今为止最常见的实现选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)