2.2.12 无法确定顺序的副作用
2025年2月21日大约 1 分钟
在本节前面的内容中,介绍了一些会修改对象值的表达式,例如自增运算符、赋值表达式等。让多个这样的表达式组合在一起,可能会产生一些令人困惑的结果。
int i = 1;
i = ++i + 2 // i 的值是 4在前面的赋值表达式中,介绍了赋值表达式会先计算左边表达式,再计算右边表达式,最后赋值。所以,这里的计算过程是:
- 先计算左边,i表达式的值是1,且表示i对象。
- 再计算右边,++i + 2表达式的值是4,发生副作用,i的值变为2。
- 最后赋值,i的值变为4。
但是,并不是所有的表达式都像赋值表达式这样规定了顺序。例如:
i = ++i + i++;这里 ++i 和 i++ 都会对 i 产生副作用,但是 C++ 规定 + 两边的表达式的计算是无顺序的。
对这样的表达式求值是错误的,无论是在学习还是在实际开发中,都应当避免写出这样的表达式。
为了方便读者,这里也总结一下前文提到的有计算顺序的表达式: