由一道题引起的“感叹号=“与=优先级比较思考

简介: 由一道题引起的“感叹号=“与=优先级比较思考

前几日做题

写到了如下一道题,统计各个字符的个数

#include <stdio.h>
int main()
{int digit,i,letter,other;
    char ch;
    digit=letter=other=0;
    printf("Enter characters:");
    while(ch=getchar()!='\n')
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    letter++;
    else if(ch>='0'&&ch<='9')
    digit++;
    else
    other++;
    printf("letter=%d,digit=%d,other=%d\n",letter,digit,other);
    return 0;
        
    
}

你是否发现这个代码存在一些问题?正是运算符优先级带来的结果错误

若输入f(x,y)=3x+5y-10,结果为14 0 0,显然,这不是我们想要的结果。

问题出在while(ch=getchar()!='\n'),若改为while((ch=getchar()!)='\n'),结果正确。

如果将 while 循环的条件改为 while (ch = getchar() != '\n'),会导致程序出现逻辑错误。这是因为赋值运算符 = 的优先级低于比较运算符 !=,所以这个条件实际上等同于 while (ch = (getchar() != '\n'))。

在这种情况下,getchar() 返回的是输入的字符的 ASCII 值,然后与 '\n' 比较。这样的比较会产生一个布尔值(true 或 false),然后将该布尔值赋给 ch。因此,ch 将被赋值为 1 或 0,而不是用户输入的字符。

这会导致程序不再按照预期工作,因为 ch 的值将始终是 1 或 0,而不是用户输入的实际字符。这将导致字符分类的逻辑失效,程序将不再正确统计字母、数字和其他字符的数量。

正确的写法是将赋值语句用括号括起来,以确保赋值操作在比较之前完成,即 while ((ch = getchar()) != '\n')。这样可以保证 getchar() 的返回值被赋给 ch,然后再与 '\n' 比较。

如果有收获或其他想法,欢迎评论区交流!

相关文章
|
7月前
|
C语言 C++
操作符的属性:优先级、结合性(缺表达式求值)
操作符的属性:优先级、结合性(缺表达式求值)
49 0
|
7月前
|
C++
c++运算符的优先级
c++运算符的优先级
119 0
|
JavaScript 算法
v-if和v-for的优先级是什么?
v-if和v-for的优先级是什么?
125 0
|
7月前
|
Python
运算符的优先级
运算符的优先级
96 2
|
7月前
|
Java
Java运算符优先级详解
Java运算符优先级详解
216 1
|
7月前
|
网络协议
优先级总结
优先级总结
54 1
|
安全 UED
如何思考需求的优先级?
如何思考需求的优先级?
96 0
|
JavaScript 前端开发