Skip to content

2.2.12 无法确定顺序的副作用

This content is not available in your language yet.

在本节前面的内容中,介绍了一些会修改对象值的表达式,例如自增运算符、赋值表达式等。让多个这样的表达式组合在一起,可能会产生一些令人困惑的结果。

int i = 1;
i = ++i + 2 // i 的值是 4

在前面的赋值表达式中,介绍了赋值表达式会先计算左边表达式,再计算右边表达式,最后赋值。所以,这里的计算过程是:

  1. 先计算左边,i 表达式的值是 1,且表示 i 对象。
  2. 再计算右边,++i + 2 表达式的值是 4,发生副作用,i 的值变为 2。
  3. 最后赋值,i 的值变为 4。

但是,并不是所有的表达式都像赋值表达式这样规定了顺序。例如:

i = ++i + i++;

这里 ++i 和 i++ 都会对 i 产生副作用,但是 C++ 规定 + 两边的表达式的计算是无顺序的。

对这样的表达式求值是错误的,无论是在学习还是在实际开发中,都应当避免写出这样的表达式。

为了方便读者,这里也总结一下前文提到的有计算顺序的表达式: