关于((ch = getchar()) != EOF),ch声明为整型的问题

在使用C语言的输入功能时,经常会看到以下的一个常用代码段

int ch;
while ((ch = getchar()) != EOF && ch != '\n')
        ;

此处为什么不声明ch为char类型而是声明为int类型,为什么ch被声明为整型,而事实上需要用它来读取字符?

这是因为char变量可以由范围在0~255中的无符号整数来表示,但EOF可能具有数值-1,该值对无符号char变量是不可能的值,但对int则是可能。
在使用有符号char类型的实现中(由范围-128~127表示),将ch声明为char类型仍然可以,但是为了可移植性,最好使用int。同时这里会有一个问题,把ch声明为char类型有可能从输入读取的字符会意外地被解释为EOF(原因在于这些扩展字符ASCII > 127溢出被解释为EOF)。

另外再从一些移植性角度去解释:
当把一个char类型变量转换为int类型时,转换结果不应该是一个负值。在某些机器上,如果一个char类型变量的最高二进制位是1,那么在把它转换为一个整数的时候,就可能得到一个负数的结果,在另外一些机器上,当需要把一个char类型变量转换为一个整数的时候,系统会在它的最高二进制位处添加一些0,这样,不管将被转换的char类型变量的最高位是1还是0,这种转换的结果将永远是一个正数。

我们知道,十进制的-1将被表示为十六进制的0xFFFF(假设是在16位系统上)。当把0xFFFF保存到一个char类型变量去时,实际被保存的数字将是0xFF(截断),当把0xFF转换为一个整数的时候,它可能被转换为0x00FF(十进制的255),也可能被转换为0xFFFF(十进制的-1)。

所以,将ch声明为int型的话,则不会出现这种转换问题。

你可能感兴趣的:(c语言)