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++ 规定 +
两边的表达式的计算是无顺序的。
对这样的表达式求值是错误的,无论是在学习还是在实际开发中,都应当避免写出这样的表达式。
为了方便读者,这里也总结一下前文提到的有计算顺序的表达式: