EOF练习1-6 K&R C编程语言

3

以下内容直接摘自 K&R 书籍:

The precedence of != is higher than that of =, which means that in the absence of parentheses the relational test != would be done before the assignment =. So the statement

c = getchar() != EOF

is equivalent to

c = (getchar() != EOF)

This has the undesired effect of setting c to 0 or 1, depending on whether or not the call of getchar returned end of file. (More on this in Chapter 2.)

Exercise 1-6. Verify that the expression getchar() != EOF is 0 or 1.

我不太理解如何完成这个练习以及块引用段落中发生的事情。
我知道 EOF 是 int 类型的符号常量,通常值为 -1。由于负值的 int 无法与 char 相同的值进行比较,所以它需要被提升为 int,然后以某种方式表示文件的结尾。
我也明白,在上面未指定括号的情况下,赋值操作会在比较操作 '!=' 之前执行,但实际上意味着什么?那个函数会发生什么事情呢?此外,我打印了 EOF 的值是 -1,当练习说要验证它是否为 0 或 1 时,这意味着什么?

你应该验证(getchar() != EOF)的值是0还是1。括号中的句子意味着如果没有括号,它与c = (getchar() != EOF)相同。 - Daniel Fischer
“因为负值的int类型永远无法保存与char类型相同的值”这种说法是错误的。char类型的值可以是负数。实际上,getchar()函数的结果首先会被内部转换为unsigned char类型,然后再将该转换结果转换为int类型——基本上就是这最后一步转换不可能是负数。 - pmg
如果你将 getchar 的结果存储在一个 char 中,那么当检查是否等于 EOF 时,它的实现是不确定的。如果 char 是有符号的,那么可能没问题 -- 但它会错误地将值为 255 的字符解释为 EOF,这不是好的编程习惯。 - teppic
1个回答

4

这段代码的意思是:

c = (getchar() != EOF)

stdin读取一个字符,然后将其与EOF进行比较。如果为真,则结果为1,如果为假,则结果为0。然后将此结果赋值给c。读取的字符将会丢失,因此会产生“不良影响”。

它希望您以以下方式运行此代码,以查看如何通过发送EOF与任何其他字符来生成0和1。


@Prafiate 在同一本书的第2章第42页中,他们还更详细地说:“同样,如果在调用getchar之前将c与EOF进行测试,那将是不幸的;因此,在测试c中的字符之前必须进行调用和赋值。” 然后他们举了一个例子,更好地阐明了为什么优先级很重要。 - 3rika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接