getchar() 从这个名字来看应该是 得到一个字符。 正好C语言里面有一个char类型, 很容易就出现了如下程序:
# include <stdio.h>
int main (void)
{
char c;
while((c = getchar()) != EOF)
{
putchar(c);
}
return 0;
}
主要谈一下下面这条语句:
while((c = getchar()) != EOF)
首先 getchar函数的原型是:int getchar(void); 上面这条while语句的意思是:如果标准输入文件中输入的不是EOF,那么执行循环体。 getchar函数返回值是一个int型,但是上面我们使用了char型来接, 这就意味着c可能不能容下所有可能的字符,可能无法容下EOF。
因此最终结果存在两种可能:一种是某些合法的字符被“截断”之后的值与EOF相同, 这种情况导致的结果就是复制可能会提前停止。 第二种情况是可能无法取到EOF,即死循环。
其实还有一种情况:这个程序能顺利运行是因为巧合。why?
好好解释一下这条语句, 按照我的理解应该是:将getchar函数的返回值放在c的内存空间里面,如果内存不够,就“截断”。然后将c和EOF作比较。 如果c不是EOF,那么成立。 但是许多编译器并不是这么实现的。 这些编译器确实对getchar的返回值做了“截断”处理,但是与EOF比较的不是c,而是getchar函数的返回值。具体怎么实现的我也不知道,可能是用一个变量来记录getchar的返回值,然后与EOF比较;也可能是其他的。 如果我们使用的编译器是上面这种,那么结果就和我们最初的预想相同了。但是如果不是这样呢? 所以说这个一个巧合。 我们用的时候应该使用int型变量来“装”getchar的返回值。
------------------
文章内容来自于:《c 陷阱与缺陷》 第5.1章 P84