我正在学习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
,在我带有GCC的Windows计算机中,它原来是-1
,不能用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
,不显示任何字符(实际上,根据%c, c
的ASCII表,此处应该显示nbs(no-break space)
,但它是不可见的)。
那么如何在没有任何编译器错误的情况下为char
分配EOF
?
此外,考虑到EOF
为-1
,以上的b
和e
是否都在内存中分配了FF
?否则编译器如何区分EOF
和nbs
...?
更新:
最有可能将EOF 0xFFFFFFFF
转换为char 0xFF
,但在(c = getchar()) != EOF
中,LHS 0xFF
在比较之前会先提升为0xFFFFFFFF
,因此c
的类型可以为int
或char
。
在这种情况下,EOF
恰好是0xFFFFFFFF
,但从理论上讲EOF
可以是任何需要8位以上的值才能正确表示的最左端字节,不一定是FFFFFF
,因此char c
方法将失败。
参考:K&R C编程语言2e
EOF
和0xFF
不相同。因此,编译器必须区分它们。如果看到man page for getchar()
,您会知道它会在文件或错误结束时将读取的字符作为无符号字符返回到int或EOF。
此代码有效,因为您正在使用signed