C语言逻辑运算的短路特性

来源:互联网 发布:linux创建新目录命令 编辑:程序博客网 时间:2024/04/19 18:55
原理:(表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达式2“被短路”(表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”
举例:
1、x=y=z=0;
c=++x||++y&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
结果:x=1,y=0,z=0
解释:由于第一个是“或”运算符,当++z为1时,它具有短路特性,屏蔽掉后面的运算符。
2、x=y=z=0;
c=(++x||++y)&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
结果:x=1,y=0,z=1
解释:由于在c的左边的逻辑表达式中的第一项含有“()”,所以(++x||++y)作为一个整体——作为一个数,所以先算括号里面的,然后由于“&&”的运算符的特性,再算++z,而对于括号里的再由于“||”的短路特性,只算了“++x”,由于它为“1”,所以“++y”就被屏蔽了。
3、x=y=0
c=x&&++y||++z;
结果:c=1,x=0,y=0,z=1
解释:注意逻辑运算符的运算顺序是自左向右,所以对于左边第一个“&&”运算符,首先算出它的逻辑值,再和后面的“||”运算,作为c的结果。根据优先级的顺序和“&&”的短路特性,由于开始x=0,则整个“&&”的逻辑表达式的逻辑值就是0,而且++y也被屏蔽掉了,再由于后面的“||”的特性,根据++z,可知c=1,z=1。
4、x=y=z=0;
c=x||++y&&z;
结果:c=0,x=0,y=1,z=0
解释:如果“||”前为“ 1”,则整个表达式即c=1;若“||”
前为“0”时,那么根据“||”的特性,该表达式的值由后面的逻辑值确定。对于后面的逻辑表达式,根据“&&”的特性,由于++y=1而z=0,可知c=0,y=1。
5、x=y=z=0;
c=x||++y&&++z;
结果:c=1,x=0,y=1,z=1
解释:结合上一题可知,由于x=0,则该表达式的值由后面的表达式确定,根据“&&”的特性,由于“++y”的值为“ 1”,则继续再算“&&”后面的“++z”,由于“++z”的值也为“1”,所以c=1,y=1,z=1。
6、x=y=z=0;
c=x&&++y&&++z;
结果:c=0,x=0,y=0,z=0
解释:首先根据运算符的优先级,运算从左至右,对于第一个“&&”,由于x=0,则这个逻辑运算符的逻辑值为“0”,且屏蔽了后面的“++y”。再于逻辑运算符的逻辑值为“0”且后面为“&&”,根据它的短路特性后面的“++z”被屏蔽了。所以整个表达式的值即c=0,x=0,y=0,z=0。
最后,总结一下关于类似c=++x&&++y||++z这类任何形式的逻辑表达试,均相当于c=(++x&&++y)||++z,但同时要结合其“&&”、和“||”不同的短路特性以及其内部的短路特性,可以正确地算出其逻辑值。
0 0
原创粉丝点击