换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会立即知道这一点,而其他人可能会发现答案很有用。
最佳答案
不,|=
和 &=
不会短路,因为它们是 &
和 |< 的复合赋值版本
,不会短路。
JLS 15.26.2 Compound Assignment Operators
A compound assignment expression of the form
E1 op= E2
is equivalent toE1 = (T)((E1) op (E2))
, whereT
is the type ofE1
, except thatE1
is evaluated only once.
因此,假设 boolean &
,isFoobared &= methodWithSideEffects()
的等价是:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面,&&
和 ||
会短路,但令人费解的是,Java 没有针对它们的复合赋值版本。也就是说,Java既没有&&=
也没有||=
。
另见
- Shortcut “or-assignment” (|=) operator in Java
- What’s the difference between | and || in Java?
- Why doesn’t Java have compound assignment versions of the conditional-and and conditional-or operators? (&&=, ||=)
这到底是什么短路业务?
boolean
逻辑运算符(&
和 |
)与其对应的 boolean
条件运算符( &&
和 ||
) 是前者不“短路”;后者做。也就是说,假设没有异常(exception)等:
&
和|
总是 计算两个操作数&&
和||
有条件地评估右操作数;只有当右操作数的值会影响二元运算的结果时,才会计算右操作数。这意味着在以下情况下不评估右操作数:&&
的左操作数计算结果为false
- (因为无论正确的操作数计算成什么,整个表达式都是
false
)
- (因为无论正确的操作数计算成什么,整个表达式都是
||
的左操作数计算结果为true
- (因为无论正确的操作数计算为什么,整个表达式都是
true
)
- (因为无论正确的操作数计算为什么,整个表达式都是
引用文献
关于java - 在 Java 中 &= 和 |= 会短路吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3152208/