深入解读C语言中的符号常量EOF

2020-01-06 14:05:43丽君


c = getchar()

之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量保存的值。也就是说,
赋值可以作为更大的表达式的一部分出现。如果将为c赋值的操作放在while循环语句的测
试部分中,上述字符复制程序便可以改写成下列形式:


#include <stdio.h>
/* copy input to output; 2nd version */
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}

      在该程序中,while 循环语句首先读一个字符并将其赋值给c,然后测试该字符是否为文件
结束标志。如果该字符不是文件结束标志,则执行while语句体,并打印该字符。随后重复
执行while语句。当到达输入的结尾位置时,while循环语句终止执行,从而整个main函
数执行结束。
      以上这段程序将输入集中化,getchar函数在程序中只出现了一次,这样就缩短了程序,
整个程序看起来更紧凑。习惯这种风格后,读者就会发现按照这种方式编写的程序更易阅读。
我们经常会看到这种风格。(不过,如果我们过多地使用这种类型的复杂语句,编写的程序可
能会很难理解,应尽量避免这种情况。)
对while语句的条件部分来说,赋值表达式两边的圆括号不能省略。不等于运算符!=的
优先级比赋值运算符=的优先级要高,这样,在不使用圆括号的情况下关系测试!=将在赋值=
操作之前执行。因此语句


c = getchar() != EOF

等价于语句


c = (getchar() != EOF)

验证与打印EOF

1. 验证表达式 getchar() != EOF 的值是 0 还是 1。


#include <stdio.h>

main()
{
 int c;
  
  while(c = (getchar() != EOF))
   printf("%dn", c);
  printf("%d - at EOFn", c);
}

程序会读取字符,当有字符可读时,getchar() 不会返回文件结束符(EOF),所以 getchar() != EOF 的取值为真,变量 c 将被赋值为 1。当程序遇到文件结束符时,表达式取值为假,此时变量将被赋值为 0,程序将运行结束。

对于一个判断表达式,它的返回值会是一个布尔值。

2. 请编写一个打印 EOF 值的程序


#include <stdio.h>

main()
{
 printf("EOF is %dn", EOF);
}