C++运算表达式求值顺序

版权声明:小能 https://blog.csdn.net/qq_43152052/article/details/88429845

求值顺序

优先级虽然规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值。例如:

int i=f1()*f2();//我们不知道先求f1还是先求f2,倘若f1和f2指向并修改了同一对象,则会引发错误。

例如:int i=0;cout<<i<<‘ ’<<++i;

结果:本人在VS2017中得到的允许结果为1、1,这个就是错误表达式,产生未定义的行为。

有4中运算符规定了运算符对象的求值顺序:

逻辑与(&&)运算符:它规定先求左侧运算对象的值,只有当左侧对象的值为真时它才继续求右侧对象的值。

逻辑或(||)运算符:和逻辑与运算符一样先求左侧对象的值再求右侧对象的值。当且仅当左侧对象为假时才对右侧对象求值。

条件(?:)运算符:cond?expr1:expr2;首先先求cond的值,如果条件为真对expr1求值并返回该值,否则对expr2求值并返回该值。

逗号(,)运算符:首先对左侧的表达式求值,然后将求值结果丢弃掉。逗号运算符真正的结果是右侧表达式的值。如果右侧运算对象的值是左值,那么最终的求值结果也是左值。

求值顺序、优先级、结合律:

在这里插入图片描述

建议:处理复合表达式

1:对于不确定组合方式的优先级和结合律的时候,使用圆括号()强制组合。

2:如果改变了某个运算对象的值,在表达式的其他地方就不要再使用这个运算对象了。

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/88429845