前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >由一道题引起的“感叹号=“与=优先级比较思考

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

作者头像
用户11039545
发布2024-03-28 17:18:46
680
发布2024-03-28 17:18:46
举报
文章被收录于专栏:c语言

前几日做题

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

代码语言:javascript
复制
#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' 比较。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档