我正在学习 K&R 的经典 C 编程书籍第二版,这是第 17 页的示例:
#include <stdio.h>
/* copy input to output*/
main()
{
int c;
// char c works as well!!
while ((c = getchar()) != EOF)
putchar(c);
}
书中说int c
用于容纳EOF
,结果是-1
在我的带有 GCC 的 Windows 机器中,不能用char
。然而,当我尝试char c
它工作没有问题。奇怪的是我又尝试了一些:
int a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);
输出是-1 -1 -1
没有显示任何字符(实际上根据 ASCII 表%c, c
这里应该有一个nbs(no-break space)
显示但不可见)。
那么怎样才能char
被分配给EOF
没有任何编译器错误?
此外,鉴于EOF
is -1
, 都是b
and e
上面指定的FF
在记忆中?不应该的,否则编译器如何区分EOF
and nbs
...?
Update:
最有可能的EOF 0xFFFFFFFF
被投射到char 0xFF
but in (c = getchar()) != EOF
左心轴0xFF
int 提升为0xFFFFFFFF
在比较之前,所以类型c
可以是int
or char
.
在这种情况下EOF
恰好是0xFFFFFFFF
但理论上EOF
可以是任何需要超过 8 位才能正确表示的值,最左边的字节不一定是FFFFFF
那么那么char c
方法将会失败。
参考:
K&R C 编程语言 2e