When used with boolean operands, & and | become logical operators per Section 15.22.2 of the JLS. Unlike && and ||, however, these don’t short-circuit; they always evaluate both sides. I have a silly question: Why are the less-efficient non-short-circuit logical operators (&, |) still there, when we have the more-efficient short-circuit logical operators (&&, ||)? I mean, what is the real usage of the non-short-circuit logical operators, as opposed to with the short-circuit logical operators? In other words, what is the usage of always evaluating both sides by using the non-short-circuit logical operators?
When used with boolean operands, & and | become logical operators per Section 15.22.2
Share
Updated answer:
Apologies, I missed the word “logical” in your question even though it is there. (I’ve taken the liberty of emphasizing it a bit with an edit.)
Consider the case where you want any side-effects to always occur, regardless of whether the left-hand expression evaluates
trueorfalse. E.g., contrast:with
Let’s assume both
fooandbarhave effects that we want to have happen regardless of whetherfooreturnstrueorfalse. In the first one above, I know thatbarwill always get called and have its effect. In the latter, of course,barmay or may not get called. If we didn’t have the non-short-circuit version, we’d have to use temporary variables:You might argue (I probably would) that you should do that anyway, because it’s way too easy to misread
if (foo() & bar()), but there we go, a pragmatic reason for having non-short-circuit versions.Original answer:
How would you propose
&(or|) be a short-circuited operator? With&&and||, it makes sense because you’re dealing with boolean conditions: They can be true or false, there are no shades of grey. But&and|deal with bits, not booleans. The result is a number. I mean, I guess&could not evaluate the right-hand side if the left-hand side were0, and similarly|could not evaluate it if the left-hand side were all-bits-on for whatever the type was, but I don’t see much point to making the one edge case of each operator significant (as compared to the 254 or more other cases).