Richard

getchar()返回的居然是int型

0
阅读(1981)

#include <stdio.h>
int main()
{
printf("%d\n", sizeof(getchar()));
return 0;
}

本来以为结果会是1,因为我向来以为getchar()返回的是char型(正如他的函数名所揭示的),但是我错了。结果是4,就是说getchar()返回的竟然是int型。哈哈,一个使用了无数次的函数居然每次都让我用错。若不是把stdio.h看了一下,我还要错多久?

看来以前这样的用法不能再用了:

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

原因在于程序中的变量c被声明为char类型,而不是int类型。这意味着c无法容下所有可能的字符,特别是,可能无法容下EOF。因此,最终结果存在两种情况。一种可能是:某些合法的输入字符在被“截断”后使得c的取值与EOF相同;另一种可能是,c根本不可能取到EOF这个值。对于前一种情况,程序将在文件复制的中途终止;对于后一种情况,程序陷入一个死循环。实际上,还有可能存在第三种情况:程序表面上似乎能够正常工作,但完全是因为巧合。尽管函数getchar的返回结果在赋给char类型的变量c时会发生“截断”操作,尽管while语句中比较运算的操作数不是函数getchar的返回值,而是“被截断”的值c,然而令人吃惊的是许多编译器对上述表达式的实现并不正确。这些编译器确实对函数getchar的返回值作了“截断”处理,并把低端字节部分赋给了变量c。但是,它们在比较表达式中并不是比较c与EOF,而是比较getchar函数的返回值与EOF!编译器如果采取的是这种做法,上面的例子程序看上去就能够“正常”运行了。

Sigh!