java – 不明白“除了E1只评估一次”之外的含义

我已经看到JLS引用的以下短语经常被引用:

A compound assignment expression of the form E1 op= E2 is equivalent
to E1 = (T)((E1) op (E2)), where T is the type of E1, except that E1
is evaluated only once.

但是,我不明白“除了E1仅评估一次”之外的含义.
在什么情况下“E1”被评估两次?

最佳答案 如果它实际上是

 E1 = (T)((E1) op (E2))

表达式E1被解释两次 – 一次在右边计算地址以读出旧值,一次在左边计算地址以存储新值.如果E1有副作用,则每次都会发生,并且两个地址可能不同. (虽然这通常是不好的做法,因为除了一些特定的习惯用法之外,它往往会严重混淆其他阅读代码的人 – 如果你必须这样做,并且它的作用并不完全明显,请务必提供解释它的评论!)

但既然你写了

 E1 op= E2

E1仅被解释一次,以获得读取旧值的地址以及写入新值的地址. (这是你所期望的,因为E1只在复合赋值表达式中出现一次.)副作用只发生一次,并且读取和写入的地址承诺是相同的.

点赞