No, |=
and &=
do not shortcircuit, because they are the compound assignment version of &
and |
, which do not shortcircuit.
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.
Thus, assuming boolean &
, the equivalence for isFoobared &= methodWithSideEffects()
is:
isFoobared = isFoobared & methodWithSideEffects(); // no shortcircuit
On the other hand &&
and ||
do shortcircuit, but inexplicably Java does not have compound assignment version for them. That is, Java has neither &&=
nor ||=
.
See also
What is this shortcircuiting business anyway?
The difference between the boolean
logical operators (&
and |
) compared to their boolean
conditional counterparts (&&
and ||
) is that the former do not "shortcircuit"; the latter do. That is, assuming no exception etc:
&
and |
always evaluate both operands
&&
and ||
evaluate the right operand conditionally; the right operand is evaluated only if its value could affect the result of the binary operation. That means that the right operand is NOT evaluated when:
- The left operand of
&&
evaluates to false
- (because no matter what the right operand evaluates to, the entire expression is
false
)
- The left operand of
||
evaluates to true
- (because no matter what the right operand evaluates to, the entire expression is
true
)
References
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…