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));

所以&&比||优先级高,仅仅确定了这一层括号,而运算顺序仍然是从左到右,因此||后面的语句短路。

 

 

结论:优先级只是决定了表达式的结合次序,而不是运算顺序!

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐