繁体   English   中英

关于C中的int,char和EOF的困惑

[英]confusion about int, char, and EOF in C

我正在学习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表%c, c此处%c, c应该显示nbs(no-break space)但它是不可见的)。

那么如何在没有任何编译器错误的情况下为EOF分配char

此外,假设EOF-1 ,则be是否都在内存中分配给FF以上? 否则编译器如何区分EOFnbs ...?

更新

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

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

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

在此处输入图片说明

该代码有效,因为您使用的是签名 char 如果查看ASCII表 ,则会发现两件事:首先,只有127个值。 127需要七个位来表示,而最高位是符号位。 其次, EOF不在此表中,因此OS可以自由定义它。

编译器允许从charint赋值,因为您是从较小的类型分配为较大的类型。 保证int能够表示char可以表示的任何值。

还需要注意的是0xFF时解释为等于255 unsigned char和-1时,解释为一个signed char

0b11111111

但是,当表示为32位整数时,它看起来非常不同:

255 : 0b00000000000000000000000011111111
-127: 0b11111111111111111111111110000001

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

您的while((c = getchar()) != EOF)被扩展为

((unsigned int)c != (unsigned int)EOF)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM