再问 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码对应的字符我就不知道了
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换 (数据类型)表达式 ++ 自增运算符 ++变量名/变量名++ 单目运算符 -- 自减运算符 --变量名/变量名-- 单目运算符 * 取值运算符 *指针变量 单目运算符 & 取地址运算符 &变量名 单目运算符 ! 逻辑非运算符 !表达式 单目运算符 ~ 按位取反运算符 ~表达式 单目运算符 sizeof 长度运算符 sizeof(表达式) 3 / 除 表达式/表达式 左到右 双目运算符 * 乘 表达式*表达式 双目运算符 % 余数(取模) 整型表达式/整型表达式 双目运算符 4 + 加 表达式+表达式 左到右 双目运算符 - 减 表达式-表达式 双目运算符 5 << 左移 变量<<表达式 左到右 双目运算符 >> 右移 变量>>表达式 双目运算符 6 > 大于 表达式>表达式 左到右 双目运算符 >= 大于等于 表达式>=表达式 双目运算符 < 小于 表达式<表达式 双目运算符 <= 小于等于 表达式<=表达式 双目运算符 7 == 等于 表达式==表达式 左到右 双目运算符 != 不等于 表达式!= 表达式 双目运算符 8 & 按位与 表达式&表达式 左到右 双目运算符 9 ^ 按位异或 表达式^表达式 左到右 双目运算符 10 | 按位或 表达式|表达式 左到右 双目运算符 11 && 逻辑与 表达式&&表达式 左到右 双目运算符 12 || 逻辑或 表达式||表达式 左到右 双目运算符 13 ?: 条件运算符 表达式1? 表达式2: 表达式3 右到左 三目运算符 14 = 赋值运算符 变量=表达式 右到左 /= 除后赋值 变量/=表达式 *= 乘后赋值 变量*=表达式 %= 取模后赋值 变量%=表达式 += 加后赋值 变量+=表达式 -= 减后赋值 变量-=表达式 <<= 左移后赋值 变量<<=表达式 >>= 右移后赋值 变量>>=表达式 &= 按位与后赋值 变量&=表达式 ^= 按位异或后赋值 变量^=表达式 |= 按位或后赋值 变量|=表达式 15 , 逗号运算符 表达式,表达式,… 左到右 从左向右顺序运算
[解决办法]
记不清算符优先级的时候就多加()