首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

再问 while(ch=getchar()!=EOF)解决方案

2012-09-21 
再问while(chgetchar()!EOF)这是做一个习题遇见的问题。比如:while(chgetchar()!EOF)//error和while((c

再问 while(ch=getchar()!=EOF)
这是做一个习题遇见的问题。

比如:
 while(ch=getchar()!=EOF) //error

 while((ch=getchar())!=EOF) //多了层括号

类似如下代码:

#include <stdio.h>
int main(void)
{
char ch;
int a;
a=0;

while ((ch = getchar())!=EOF) //如果去掉这层括号while (ch = getchar()!=EOF) 
{
if (ch >= ' ' || ch == '\n' || ch == '\t')
printf("%-5c",ch);
else printf("^%-4c",ch+64);
printf("%-5d",ch);

if(a%8 == 0) 
printf("\n");

a++;
}
return 0;
}

这个程序是用来读取字符流并针对不同字符采取不同的处理方式。(最后有题干)
问题在于如果去掉括号结果会出错。

运行实例:
--------------
YES:有括号的情况下
-----------
a
a 97

  10 请按任意键继续. . .
-----------
-----------
NO:没有括号的情况下
-----------
a
^A 1
^A 1 请按任意键继续. . .
------------

故障点在于这两条语句:
while ((ch = getchar())!=EOF)  
while (ch = getchar()!=EOF) /error

为什么error语句会导致如上述输出?
while (ch = getchar()!=EOF) //这句表达式如何求值?
根据优先级:
getchar()!=EOF先结合,返回一个bool值。//这个推论正确?
然后再将来这个bool值赋值给ch? ch = (bool)x ? //这个推论正确?

总之:
我的疑惑点现在集中于:
抛掉正确与否,为什么这种(错误的)语法会导致这样(错误)的输出结果?



附上这个程序的题干:
编写一个程序,把输入作为字符流读取,直到遇到EOF。令该程序打印每个输入字符及其ASCII编码的十进制值。注意在ASCII序列中空格字符前面的字符是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分期打印\n或\t。否则,使用控制字符符号。例如,ASCII的l是Ctrl+A,可以显示为AA。注意A的ASCⅡ值是Ctrl+A的值加64。对其他非打印字符也保持相似的关系。除去每次遇到一个换行符时就开始一个新行之外,每行打印10对值。

[解决办法]
getchar()!=EOF先结合,返回一个bool值。//这个推论正确?
对的。
[解决办法]
楼上正解。
!=运算符优先级比=高,如果不加括号,就会产生上述结果,括号的优先级比!=高,加上了就会先计算括号内的部分。
[解决办法]
LS姐妹们已经说得很清楚了,必须要加括号的
[解决办法]
!=运算符优先级比=高
[解决办法]
什么意思?
如果不加括号,就是(char)ch = (bool)x? 这样赋值没有意义,但是语法没有问题。
x是0或者1,0就是 '\0',1ASCII码对应的字符我就不知道了

探讨
引用:
楼上正解。
!=运算符优先级比=高,如果不加括号,就会产生上述结果,括号的优先级比!=高,加上了就会先计算括号内的部分。


(char)ch = (bool)x ?
=>
a
^A 1

[解决办法]
优先级有时候很难记,所以多用()来明确的表示。最容易记的一个=,这个优先级相当的低,但凡出现,即认为是最后一个就好了(一些复合的除外,比如+=)。
[解决办法]
变量ch应该被定义为int类型,不然ch不会和EOF相等;因为EOF是int类型的,而ch为char类型的,表示的范围就不一样。
while ((ch = getchar()) != EOF)最后是ch和EOF比较。
[解决办法]
就是优先级的问题嘛。实践中多写括号总是木有错的。
[解决办法]
注意优先级别。。。
C/C++ code
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右  () 圆括号 (表达式)/函数名(形参表)  . 成员选择(对象) 对象.成员名  -> 成员选择(指针) 对象指针->成员名  2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式  ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变量名/变量名-- 单目运算符 * 取值运算符 *指针变量 单目运算符 & 取地址运算符 &变量名 单目运算符 ! 逻辑非运算符 !表达式 单目运算符 ~ 按位取反运算符 ~表达式 单目运算符 sizeof 长度运算符 sizeof(表达式)  3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 双目运算符 % 余数(取模) 整型表达式/整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 表达式-表达式 双目运算符 5 << 左移 变量<<表达式 左到右 双目运算符 >> 右移 变量>>表达式 双目运算符 6 > 大于 表达式>表达式 左到右 双目运算符 >= 大于等于 表达式>=表达式 双目运算符 < 小于 表达式<表达式 双目运算符 <= 小于等于 表达式<=表达式 双目运算符 7 == 等于 表达式==表达式 左到右 双目运算符 != 不等于 表达式!= 表达式 双目运算符 8 & 按位与 表达式&表达式 左到右 双目运算符 9 ^ 按位异或 表达式^表达式 左到右 双目运算符 10 | 按位或 表达式|表达式 左到右 双目运算符 11 && 逻辑与 表达式&&表达式 左到右 双目运算符 12 || 逻辑或 表达式||表达式 左到右 双目运算符 13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 14 = 赋值运算符 变量=表达式 右到左  /= 除后赋值 变量/=表达式  *= 乘后赋值 变量*=表达式  %= 取模后赋值 变量%=表达式  += 加后赋值 变量+=表达式  -= 减后赋值 变量-=表达式  <<= 左移后赋值 变量<<=表达式  >>= 右移后赋值 变量>>=表达式  &= 按位与后赋值 变量&=表达式  ^= 按位异或后赋值 变量^=表达式  |= 按位或后赋值 变量|=表达式  15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算 


[解决办法]
记不清算符优先级的时候就多加()

热点排行