前几日做题
写到了如下一道题,统计各个字符的个数
#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' 比较。
如果有收获或其他想法,欢迎评论区交流!