c语言逻辑运算符与自增自减运算符的杂糅运算

18题难道不应该先算逻辑与吗?... 18题难道不应该先算逻辑与吗? 展开
 我来答
最大的宝宝
2019-03-22 · TA获得超过828个赞
知道小有建树答主
回答量:1569
采纳率:67%
帮助的人:409万
展开全部

这涉及一个执行流程的问题,当执行到if的时候,一个合理的做法是先选择走||的哪条路,然后才是计算涉及的表达式,这是提高效率的方法,随之也会带来所谓的副作用。如果把式子改为b-- && c++ || a++,结果如你所愿,3,0,1。但以书中的例子,(a++ || b-- && c++)把a++计算完成后,发现为真,直接跳转到后面代码了,导致b和c都没有参与计算,值未被改变。这个处理方式, 至少从20年前的vc6就是如此了,其他的编译器是不是遵守这个规矩,以实践来定。

如图,cmp判断a是否为真,为真jne直接跳走,和b、c拜拜了。

zastruga
2019-03-22 · TA获得超过513个赞
知道小有建树答主
回答量:641
采纳率:85%
帮助的人:56万
展开全部

本例最重要的原因是‖的运算规则:

对于一个||逻辑或来说,只要||左边的表达式为假(即0)才执行||右边的表达式,如果||左边表达式已经为真,那么会造成所谓的“短路”即||右边的表达式不再执行。

因为a已经完成自加,为真。右边的计算就都不进行,保持原值。得到答案。

可以参考类似题目的说明:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
遗失的迷惘O
2019-03-22 · TA获得超过477个赞
知道小有建树答主
回答量:382
采纳率:77%
帮助的人:99.7万
展开全部
这个题可以换成下面的形式:
int a=2, b=1, c=0;
if(a++ || (b-- && c++))
printf("%d, %d, %d\n",a,b,c);
else
printf("AAA\n");
这样看着就比较顺眼了,在执行运算符:||
由于a++ >0因此表示式为真(截断法则),||右边的不再执行,也就是(b-- && c++)不再执行。
因此,a=3,b=1,c=0
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月之舞磊之天岚
2019-03-22 · 贡献了超过690个回答
知道答主
回答量:690
采纳率:3%
帮助的人:46.1万
展开全部
,电脑截图可以通过快捷键的方式进行截图,快捷键的操作指令是Print Screen(简称PrtSc),在键盘上面可以轻松地找到这个按键,使用这个键后就可以实现全屏截图,但是这种方式比较的单一,只能全屏截图.有时候通过这种方式截屏不知道图片保存在哪里去了,这个时候你可以通过画图将这个图片保存在其他地方.点击开始菜单,在windows附件里面找...,电脑截图可以通过快捷键的方式进行截图,快捷键的操作指令是Print Screen(简称PrtSc),在键盘上面可以轻松地找到这个按键,使用这个键后就可以实现全屏截图,但是这种方式比较的单一,只能全屏截图.有时候通过这种方式截屏不知道图片保存在哪里去了,这个时候你可以通过画图将这个图片保存在其他地方.点击开始菜单,在windows附件里面找...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
游过的悲痛
2023-10-09
知道答主
回答量:2
采纳率:0%
帮助的人:1167
展开全部
因为优先级和结合性都是在决定操作数的结合顺序,而与表达式的执行顺序没有关系。
例如: 0 && a++中,虽然++的优先级比&&高,但是右边的式子始终不会执行,因为表达式从左到右执行,&&先识别到左边的0,直接短路。
题目中的表达式可以这么理解:a++ || (b-- && c++),从优先级和结合性来看,b--和c++先和&&结合,a++再与其值结合,以上体现了||和&&优先级的差异;但是执行上来说,还是从左向右,发现a++为真,就不继续向右执行了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式