关于((ch = getchar()) != EOF),ch声明为整型的问题
来源:互联网 发布:网络工程学院 编辑:程序博客网 时间:2024/06/05 02:09
在使用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型的话,则不会出现这种转换问题。
2 0
- 关于((ch = getchar()) != EOF),ch声明为整型的问题
- while((ch=getchar())!=EOF && ch != '\n')
- while((ch=getchar())!=EOF&&ch != '\n');消除非法输入
- 含义while((ch=getchar())!='#'){},while(ch=getchar(),ch!='#'),while(ch=getchar() && ch!='#')
- error:while(ch = fgetc(fStream)!= EOF)和while(ch = fgetc(fStream)&& ch != EOF)是有问题的
- C++误区一 char ch = getchar()
- 关于getchar()!=EOF问题
- getchar()和scanf("%c",ch)在用EOF判断结束时的区别
- $result = curl_exec($ch);
- ch
- 关于scanf("%c",&ch)直接跳过的问题
- 关于while ( cin >> ch )输入结束问题
- 用法char ch=getchar()正确性详解 《C陷阱与缺陷》 chap5.1
- 关于while((c = getchar()) != EOF)的使用
- 初始化char *ch =字符串
- 关于(c=getchar())!=EOF
- while((c=getchar())!=EOF)的问题
- while((c=getchar())!=EOF)的问题
- 顺序栈的实现
- 【Ogre引擎架构】 第七讲 粒子系统-爆破特效
- 使用System.Windows.Forms.Application.DoEvents实时更新画面
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- NYOJ-833解题报告
- 关于((ch = getchar()) != EOF),ch声明为整型的问题
- 抽象类与接口
- 多线程之GCD
- 站上历史浪潮的计算机(一)
- 黑马程序员——java基础之Set集合
- IplImage结构及与其相关的读写函数
- 扫雷代码
- 条款31提及pimpl设计模式
- SpriteBuilder修改CCB文件中的子CCB文件需要注意的一个地方