C++运算表达式求值顺序
求值顺序
优先级虽然规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值。例如:
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:如果改变了某个运算对象的值,在表达式的其他地方就不要再使用这个运算对象了。