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

时间:2014-02-09 01:08:42

标签: java jls

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

  

形式E1 op = E2的复合赋值表达式是等价的   到E1 =(T)((E1)op(E2)),其中T是E1的类型,除了E1   仅评估一次。

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

1 个答案:

答案 0 :(得分:2)

如果它实际上是

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

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

但是自从你写了

 E1 op= E2

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