C语言表达式的值
#include<stdio.h>
main()
{int a=2,b=3,c=-1,d=5,M;
M=a+b>c+d&&a>=c+d||!c>0||d<0;
printf("%d\n",M);
}
为什么输出0而不是1?
M=a+b>c+d&&a>=c+d||!c>0||d<0;
逻辑表达式有一个特点 即短路求值,如你上面的代码, 会首先判断
a + b > c+d是否为值//显然正确
接下来判断 a >= c+d 显然出现错误了...所以后面的||!c>0||d<0; 这些都不判断了……直接跳走了……
实际上有时候这样的代码挺难看的, 棚散可以多加几个括扒桐号 ,表达清楚你的逻辑求值顺序……
观楼主英俊潇洒、风流倜傥,必当世之豪杰,诚邀楼主加入0x30百度贴吧,共商义举,成千秋霸业链此氏。
此题考查和知识点是表达式中混合运算的优先级。
此题中单目运算符!的优先级别最高,然后是算术运算符、关系运算符、最后是逻辑运算符。
在逻辑册液运算符中,&&运算符的优先级高于 || 运算符嫌姿册。弄清了这些知识点,做此类问题就能够轻松的完成了。
对于表达式 M=a+b>c+d&&a>=c+d||!c>0||d<0; 根据运算的优先级规则,可得 !c 的级别最高,故先算出 !c 为 0。
算术运算符的优先级次之,故应当先算 a+b、c+d 和 c+d ,其结果分别为 5、6 和6。
将以上结果代入运算式 a+b>c+d&&a>=c+d||!c>0||d<0;
= 5 > 6 && 2 >=6 || 0>0 || 5 <0
= 0 && 0 || 0 || 0
= 0 || 0 || 0
= 0
注意,绝不是 a >= c+d 等于0 为非,...所以后面的||!c>0||d<0; 这些都不判断了。
若后面的 式芹宏 ||!c>0||d<0 中的!c>0 改为!c>=0 ,“后面的 这些都不判断了” 的说法就是错误的了。
只有当 a >= c+d 后面的运算都是与运算,“后面的这些都不判断” 的说法才是正确的。
a>=c+d 可以得出 && 的结果是0,然后 !c>0 等价于0>则如磨0 为假 d<0也是橡纤假 所以M是0。孙斗要弄清楚运算符的优先级别。
M=a+b>c+d&&a>=c+d||!c>0||d<0
=(a+b>c+d) &&(a>=c+d||!c>和纳0||d<0)
a+b>c+d结果是1,
a>=c+d结果升带是0
所以结果是唤笑没0