C/C++逻辑运算符 | | 和 && 的优先级误区——优先级决定运算顺序吗?
·
C++运算符优先级表:
根据这个表格,我们很容易得出结论:&&的优先级大于||
下面看一段代码,来验证这个结论
#include<iostream>
using namespace std;
int main() {
int x = 3;
int y = 1 || (x = 1) && (x += 1);
printf("x = %d , y = %d", x, y);
return 0;
}
你觉得程序输出x、y的值会是多少呢?
来过一遍:
首先int x=3;然后执行下一条语句,因为&&的优先级大于||,所以先执行(x=1)&&(x+=1),那么按理来说,x应该为2,y为1。
但事实上:输出: x = 3,y =1
why??出什么问题了?
如果是顺序出错,怎样才能让x=3呢?
如果你了解 || 和 && 的短路的话(||前者为true不执行后者,&&前者为false不执行后者),你可能会知道,要令x=3,似乎只有让后面的两条语句短路啊,也就是先执行||前面的,难道不是&&的优先级大于||吗?怎么会出现这种情况,代码出错了?编译器有问题?电脑中毒了??还是优先级表错了?
到底是为什么呢?听我给你慢慢分析。
在百度文科上运算符优先级有这样一段话:
表达式的结合次序取决于表达式中各种运算符的优先级!
很明显,这就是优先级的作用,回到开头那段代码,你会发现我分析的时候一直通过优先级来判断计算顺序,总以为优先级高的先运算,优先级低的后运算,从而导致产生了错误的判断,那么到底为什么会输出x=3呢?
如果结合的话,其实就是加一层括号,所以根据结合次序,加一层括号,得到下面的代码
int y = 1 || ((x = 1) && (x += 1));
所以&&比||优先级高,仅仅确定了这一层括号,而运算顺序仍然是从左到右,因此||后面的语句短路。
结论:优先级只是决定了表达式的结合次序,而不是运算顺序!
更多推荐
已为社区贡献4条内容
所有评论(0)