经过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
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
第一步,是自右向左赋值,使得xyz都为0.
第二步,因为&&优先级高所以把第二个式子看成++x||(++y&&++z),然后再看||,由于或运算的结合方向是自左向右,所以先进行左边的++x,使x变为1,此时整个式子为true,就不用进行后面且运算了(计算机也是只要看到||,先算左边,如果左边卫true,那么右边的就不执行了)
先++x,使得x变为1,此时++x为true(因为不等于0),那么,||是或的意思,只要++x为true了,不管||后面是什么,都不执行。
所以,++y && ++z都不会执行。
这种求值策略为“短路求值”。