C语言中&&和||的优先级问题

有如下语句:x=y=z=0;++x||++y&&++z;结果为什么是x=1y=0z=0?这样是从左向右计算的结果但是看书上说&&的优先级大于||不应该先算后面的&&吗?这... 有如下语句:
x=y=z=0;
++x||++y&&++z;
结果为什么是 x=1 y=0 z=0? 这样是从左向右计算的结果 但是 看书上说 &&的优先级大于|| 不应该先算后面的&&吗?这样结果就不一样了

求解 谢谢
展开
 我来答
金鱼8884
2015-10-29 · 知道合伙人数码行家
金鱼8884
知道合伙人数码行家
采纳数:124 获赞数:14949
学生

向TA提问 私信TA
展开全部
  经过n遍的调试,证明:
  1、||和&&优先级相等,且都是从左往右运算
  2、在出现||和&&的语句中,并不对a++进行运算,只判断它的初值。当然,这条语句结束后,涉及判断的表达式就会进行相应的运算(如:a++)。
  3、在&&运算中,如果&&前面的逻辑值为0(如:令a=0; a++&&b++,此时,a还没有进行++运算,仍为0。但是在本语句结束后就自加1),则结束本语句;如果&&前面的逻辑值为1(如:上面的情况令a=1),则继续判断&&后面的值是否为1,如果为1,则继续判断后面的逻辑运算;如果为0,而结束本语句。
  4、在||运算中,如果||前的逻辑值为1,则结束本语句如果||前的逻辑值为0,则继续判断,若||后的逻辑值为1(如:a||b++, 其中b=1),则结束本语句,否则继续往后判断举个实际的例子:#include<stdio.h>
void main()
{
int a,b,c,d;
a=0;
b=0;
c=1;
d=a++||b++&&c++; /*
  运算过程是:
  第一步,判断a 的逻辑值是否为0,可知为0,因此继续往后判断(因为a++这个表达式参与了判断,所以在这条语句结束后,a会变成1);
  第二步,判断b,可知b的逻辑值0,所以a||b==0,因为之后遇到的是&&运算,而又有&&前的逻辑值为0,直接结束本语句,因此C++并没有参与判断,保持值不变(当然,b有参加判断,结束本语句后,b为1);
  第三步,由于0&&c++==0,所以d=0*/
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}运行结果:a=1b=1c=1d=0
lyozning1219
2012-06-12 · TA获得超过462个赞
知道小有建树答主
回答量:275
采纳率:0%
帮助的人:216万
展开全部
第一步,是自右向左赋值,使得xyz都为0.
第二步,因为&&优先级高所以把第二个式子看成++x||(++y&&++z),然后再看||,由于或运算的结合方向是自左向右,所以先进行左边的++x,使x变为1,此时整个式子为true,就不用进行后面且运算了(计算机也是只要看到||,先算左边,如果左边卫true,那么右边的就不执行了)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友b0840ca
推荐于2016-06-05 · TA获得超过609个赞
知道小有建树答主
回答量:1020
采纳率:0%
帮助的人:561万
展开全部
先++x,使得x变为1,此时++x为true(因为不等于0),那么,||是或的意思,只要++x为true了,不管||后面是什么,都不执行。
所以,++y && ++z都不会执行。
这种求值策略为“短路求值”。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式