关于((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型的话,则不会出现这种转换问题。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值