关注小庄 顿顿解馋(≧◡≦)
引言:本篇博客小庄带领小伙伴们解决一个比较角落有时头疼的问题—关于逻辑与和逻辑或结合运算的问题,请放心食用~
我们先放代码说话
int main()
{
int x = 1;
int y = 3;
int z = 4;
if(x==1 || ++y && ++ z)
{
;
}
printf("y = %d z = %d",y,z);
return 0;
}
输出结果为 y = 3 z = 4
有的小伙伴可能会疑惑这里的&&不是优先级比| |高,z和y不是都该加1 ??这里我们给&&的表达式加上一个括号
int main()
{
int x = 1;
int y = 3;
int z = 4;
if(x==1 || (++y && ++ z))
{
;
}
printf("y = %d z = %d",y,z);
return 0;
}
输出结果 y = 3 z = 4
结论:``在逻辑表达式(注意是逻辑表达式中),运算符的优先级改变的是结合顺序而不是运算顺序。
对于我们的逻辑表达式,一般都是从左往右执行的,所以这里应该是先运算逻辑或操作符再计算逻辑与,那这里说的结合性又是怎么回事呢?看下面的分析
x==1 || ++y && ++ z 对于这个表达式先执行按位或是毫无疑问的,但由于&&优先级较高,所以式子等价于
x == 1 || (++y && ++ z) ,也就是说 || 左边是一个整体 右边括号括起来的是一个整体,由于左边部分表达式为true,所以整个表达式短路右边括号括起来的部分直接就不计算了。
总结:
1.对于&&和| | ,我们要看作是xxx||xxx和xxx&&xxx,xxx可以是一个数或表达式等
2.受优先级的影响,导致一部分操作数先结合视为一个整体而不是先运算
我们趁热来另一道变形
int main()
{
int x = 1;
int y = 3;
int z = 4;
if(x==0 && ++y || ++ z)
{
;
}
printf("y = %d z = %d",y,z);
return 0;
}
输出结果 y = 3 z = 5
跟之前分析一样表达式等价于(x==0 && ++y) || ++ z ,转化为xxx || xxx ,左边括起来的部分由于x不为1直接短路所以右边的++y不计算,故左边的xxx就是0,由于逻辑或短路特性,继续计算++y
那要是不混合的呢?
int main()
{
int x = 1;
int y = 3;
int z = 4;
if(x==0 && ++y && ++ z)
{
;
}
printf("y = %d z = %d",y,z);
return 0;
}
输出结果 y = 3 z = 4
此时就得利用我们的结合性了,结合性是在同等优先级情况下使用的来运算顺序,此时应该是从左往右执行也就是(x==0 && y)&& ++z
本次分享若有错误请小伙伴们指出,不妨来个一键三连吧~