问题
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.
回答1:
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= E2is equivalent toE1 = (T)((E1) op (E2)), whereTis the type ofE1, except thatE1is 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
- 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? (&&=, ||=)
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 tofalse- (because no matter what the right operand evaluates to, the entire expression is
false)
- (because no matter what the right operand evaluates to, the entire expression is
- The left operand of
||evaluates totrue- (because no matter what the right operand evaluates to, the entire expression is
true)
- (because no matter what the right operand evaluates to, the entire expression is
- The left operand of
References
- JLS 15.22.2 Boolean Logical Operators &, ^, and |
- JLS 15.23 Conditional-And Operator &&
- JLS 15.24 Conditional-Or Operator ||
回答2:
No, they do not, because x &= y is short for x = x & y and x |= y is short for 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. 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.
来源:https://stackoverflow.com/questions/3152208/do-and-short-circuit-in-java