打印
[AVR单片机]

逻辑运算符的混合运算

[复制链接]
1015|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renzhu|  楼主 | 2015-8-14 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面说说逻辑运算符的混合运算:
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,但同时要结合其“&&”、和“||”不同的短路特性以及其内部的短路特性,可以正确地算出其逻辑值。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

115

帖子

0

粉丝