我已经看到JLS引用的以下短语经常引用:
形式E1 op = E2的复合赋值表达式是等价的 到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1 仅评估一次。
但是,我不明白“除了E1仅评估一次”的含义。 在什么情况下“E1”被评估两次?
答案 0 :(得分:2)
如果它实际上是
E1 = (T)((E1) op (E2))
表达式E1被解释两次 - 一次在右边计算地址以读出旧值,一次在左边计算地址以存储新值。如果E1有副作用,则每次都会发生,并且两个地址可能不同。 (虽然这通常是不好的做法,因为除了一些特定的习惯用法之外,它往往会严重混淆其他阅读代码的人 - 如果你必须这样做,并且它的作用并不完全明显,请务必提供解释它的评论!)
但是自从你写了
E1 op= E2
E1只被解释一次,以获得读取旧值的地址以及写入新值的地址。 (这是你所期望的,因为E1只在复合赋值表达式中出现一次。)副作用只发生一次,并且读取和写入的地址承诺是相同的。