C语言中逻辑运算的“短路”特点的疑问。

程序如下:
#include<stdio.h>
int main()
{int x=0,y=0,z=0,t;
t=++x||++y&&++z;
printf("x=%d,y=%d,z=%d,t=%d\n",x,y,z,t);
x=y=z=-1;
t=++x&&++y||++z;
printf("x=%d,y=%d,z=%d,t=%d\n",x,y,z,t);
}
运行结果如下:
x=1,y=0,z=0,t=1
x=0,y=-1,z=0,t=0
第一个结果t是不是这样得到的:
首先运行++x,其值为1,遇到逻辑运算符||,由于||是有一个为1,整个便为1,所以“短路”,不再运行++y和++z(为什么不继续运行++z呢)并且t值为1 ?
那要是根据第一个的过程,第二个t在计算时,先算++x,其值为0,而逻辑运算符&&遇0则整个为0,不再运行++y和++z,可是由结果看,它只是不运行了++y,而++z却也运行了。
同样是逻辑运算符,为何一个短路就不运行++z,另一个短路运行了++z呢?
求大神解答,谢谢!

先请你思考个问题想不出来自己先去用编译器验证(关于运算符优先级、结合性、复杂表达式先计算那个的问题)

问题一 这三个语句的区别 ,那两个效果一样呢

t=++x||++y&&++z;

t=(++x||++y)&&++z;

t=++x||(++y&&++z);

类似的问题下面三个语句的区别

t=++x&&++y||++z;

t=++x&&(++y||++z);

t=(++x&&++y)||++z;

不想做过多解释,另外上几个汇编分析的截图给你看

追问

谢谢!
接触编程也是C语言的第一个学期,目前还无法理解截图中的
汇编分析。
但您提出的问题还是很有帮助的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-11-24

    你的陈述正确;你的疑问是没搞清||和&&的优先级,&&要比||高一级,所以++x||++y&&++z;的实质是++x||(++y&&++z);,所以||后面的整个表达式都不计算了。

    你的疑问与第1一样,但表述有错。++x是前++,要先计算,所以++x的值是1;但&&两边都为“真”才能确定这“真”,有一边或两边都为“假”则为“假”,所以++x为1还不能确定++x&&++y的值,还要计算++y才能确定;所以++x为1时还要计算&&后面的**y,如果++x为0则就不需要计算++y了。与1一样,t=++x&&++y||++z;被解释为t=(++x&&++y)||++z;,如果++x&&++y为“真”,就不必计算++z了,因为||两边有一边为“真”就可以确定整个表达式的值了;但如果++x&&++y为“假”,那就还要计算++z,才能确定整个表达式的值t。

       “短路”是一种通俗说法,准确地说是这样的,按优先级及从左至右的计算规则,当某个逻辑运算符前面的表达式已经能够确定整个表达式的值时,这个逻辑运算符后而的所有表达式就都不计算了。



追问

谢谢您的解答。
第二个其实又重新赋值了,x=y=z=-1,但并没大影响。

本回答被提问者采纳