关于C中的int,char和EOF的混淆

问题描述 投票:5回答:2

我正在学习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,以上的be是否都在内存中分配了FF?否则编译器如何区分EOFnbs ...?

更新

最有可能将EOF 0xFFFFFFFF转换为char 0xFF,但在(c = getchar()) != EOF中,LHS 0xFF在比较之前会先提升为0xFFFFFFFF,因此c的类型可以为intchar

在这种情况下,EOF恰好是0xFFFFFFFF,但从理论上讲EOF可以是任何需要8位以上的值才能正确表示的最左端字节,不一定是FFFFFF,因此char c方法将失败。

参考:K&R C编程语言2e

enter image description here

c char int eof
2个回答
2
投票

EOF0xFF不相同。因此,编译器必须区分它们。如果看到man page for getchar(),您会知道它会在文件或错误结束时将读取的字符作为无符号字符返回到int或EOF。


2
投票

此代码有效,因为您正在使用signed

© www.soinside.com 2019 - 2024. All rights reserved.