Do &= and
In other words, do the following two statements behave the same way?
isFoobared = isFoobared && methodWithSideEffects();
isFoobared &= methodWithSideEffects();
I realize I could just write up a test, but someone might know this offhand, and others might find the answer useful.
No, |=
and &=
do not shortcircuit, because they are the compound assignment version of &
and |
, which do not shortcircuit.
JLS 15.26.2 Compound Assignment Operators
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: &&
evaluates to false
false
) ||
evaluates to true
true
) References
&
, ^
, and |
&&
||
No, they do not, because x &= y
is short for x = x & y
and x |= y
is short for x = x | y
x = x | y
. Java has no &&=
or ||=
operators which would do what you want.
The &
and |
operators (along with ~
, ^
, <<
, >>
, and >>>
) are the bitwise operators. The expression x & y
will, for any integral type, perform a bitwise and operation. Similarly, |
performs a bitwise or. To perform a bitwise operation, each bit in the number is treated like a boolean, with 1
indicating true
and 0
indicating false
. Thus, 3 & 2 == 2
, since 3
is 0...011
in binary and 2
is 0...010
. Similarly, 3 | 2 == 3
3 | 2 == 3
. Wikipedia has a good complete explanation of the different operators. Now, for a boolean, I think you can get away with using &
and |
as non-short-circuiting equivalents of &&
and ||
, but I can't imagine why you'd want to anyway.
上一篇: &&,&为什么输出不同?
下一篇: 做&=和