java - 没看懂 "except that E1 is evaluated only once"的意思

标签 java jls

我经常看到 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 在复合赋值表达式中只出现一次。)副作用只发生一次,读取和写入的地址被保证是相同的。

关于java - 没看懂 "except that E1 is evaluated only once"的意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653915/

相关文章:

java - JLS 如何指定术语 "abstract method"、 "concrete method"和 "default method"?

Java语法定义完整性

java - 什么是类的参数化调用

Java:如何在不迭代的情况下从 List<T> 转换为 Map<f1(T), List(f2(T))>

java - Spring Boot 中是否有一个很好的 zalando-problem 实现示例?

Java - 如何获得独立于系统日期的当前日期?

java -\uXXXX、\uuXXXX 和\uuuXXXX 之间的区别

java - volatile 的发生之前和重新排序

java - 为什么我无法在 Android Studio 中使用 ImageButton 上传图像文件?

java - JSON为什么要加斜杠