换句话说,以下两个语句的行为方式是否相同?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
我意识到我可以写一个测试,但有人可能会知道这个,其他人可能会觉得这个答案很有用。
答案 0 :(得分:37)
不,|=
和&=
没有短路,因为它们是&
和|
的复合分配版本,不会短路。
JLS 15.26.2 Compound Assignment Operators
E1 op= E2
形式的复合赋值表达式等同于E1 = (T)((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一旦。
因此,假设boolean &
,isFoobared &= methodWithSideEffects()
的等价是:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
另一方面&&
和||
做短路,但莫名其妙地Java没有复合赋值版本。也就是说,Java既没有&&=
也没有||=
。
boolean
逻辑运算符(&
和|
)与boolean
条件对等运算符(&&
和||
)之间的差异是前者不“短路”;后者呢。也就是说,假设没有异常等:
&
和|
始终评估两个操作数&&
和||
有条件地评估右操作数 ;只有当其值可能影响二进制操作的结果时,才会评估右操作数。这意味着在以下情况下不评估右操作数:
&&
的左操作数评估为false
false
)||
的左操作数评估为true
true
)答案 1 :(得分:4)
不,他们没有,因为x &= y
是x = x & y
的缩写,x |= y
是x = x | y
的缩写。 Java没有&&=
或||=
运算符可以执行您想要的操作。
&
和|
运营商(以及~
,^
,<<
,>>
和>>>
)是bitwise operators。对于任何整数类型,表达式x & y
将执行按位和操作。同样,|
执行按位或。要执行按位运算,数字中的每个位都被视为布尔值,1
表示true
,0
表示false
。因此,3 & 2 == 2
,因为3
为0...011
二进制且2
为0...010
。同样,3 | 2 == 3
。 Wikipedia对不同的运营商有完整的解释。现在,对于一个布尔值,我想你可以使用&
和|
作为非短路等价物{{1 }}和&&
,但我无法想象你为什么要这么做。