存储在非EOF变量中的值是多少?

时间:2013-01-09 22:38:08

标签: c

以下代码中比较的值是什么?

while ((c = getchar()) != EOF)
        if ( c == '\n')

我知道'\n'是一个常量变量,因为单引号。我知道它代表ASCII表上字符的数值,对吗?这等于110.但

是什么

((c = getchar()) != EOF)返回?

由于

3 个答案:

答案 0 :(得分:5)

关键点是c必须是int

int c;

while ((c = getchar()) != EOF) { char read_value = c; /* ... */ }

假设int可以包含比char更多的值,或者系统的窄多字节编码使用*的至少更多值,并且getchar返回特殊常量{ {1}}当它无法读取更多数据时。否则,保证您可以将EOF转换为c并获取已读取字符的值。

char本身声明为c是一个常见的错误,在这种情况下,循环可能永远不会终止,因为您可能无法捕获特殊值char,否则会有一个完全有效的字符,与EOF无法区分。

*)例如,如果(char)EOFchar在给定平台上都是32位宽,那么完全没问题,只要说,窄流可以只返回值在[-128,128]范围内的单位,您可以将int用作-200

答案 1 :(得分:2)

在c中,赋值操作返回rvalue,它是等号右侧的值。所以在这种情况下,c = getchar()返回字符或EOF。

答案 2 :(得分:1)

你的问题是:

  

但是什么是:((c = getchar()) != EOF)回复?

表达式((c = getchar()) != EOF)是一个逻辑(或“布尔”)表达式 - 它是“true”或“false”。具体来说,它测试是否某些东西不等于常数“EOF”。

“某事”是表达式(c = getchar())。这是一项任务;它调用getchar()函数并将返回值赋给变量c。赋值的值是赋值的值;因此,整个表达式会导致以下情况发生:

  1. getchar()被称为
  2. 其返回值已分配给c
  3. 然后将该值与常量EOF
  4. 进行比较
  5. 如果该值不等于EOF,则while语句将继续运行。