What are the cases in which it is better to use unconditional AND (& instead of &&)

I'd like to know some cases in Java (or more generally: in programming) when it is preferred in boolean expressions to use the unconditional AND (&) instead of the conditional version (&&).

I know how they work, but I cannot think about a case when use the single & is worth it.


I have found cases in real life where both sides of the expression were really cheap, so it shaved off a nanosecond or two to avoid the branch and to use the unconditional & instead of &&. (These were extremely high-performance math utilities, though; I would almost never use this in other code, and I wouldn't have done it anyway without exhaustive benchmarking to prove it was better.)

(To give specific examples, x > 0 is going to be super cheap and side-effect-free. Why bother risking a branch misprediction to avoid a test that's going to be so cheap anyway? Sure, since it's a boolean the end result is going to be used in a branch anyway, but if (x >= 0 && x <= 10) involves two branches, and if (x >= 0 & x <= 10) involves only one.)


The only difference is that && and || stop the evaluation as soon as it is known. So for example:

if (a != null && a.get() != null)

works well with &&, but with & you could get a NullPointerException if a is null.

The only case I can think about where you want to use & is if the second operand has a side effect, for example (probably not the best example but you get the point):

public static void main(String[] args) {
    int i = 1;
    if (i == 0 & ++i != 2) {
    }
    System.out.println(i); //2
    i = 1;
    if (i == 0 && ++i != 2) {
    }
    System.out.println(i); //1
}

However, this looks like smelly code to me (in both cases).


The && allows the jvm to do short circuit evaluation. That is, if the first argument is false, then it doesn't need to bother checking the second argument.

A single & will run both sides regardless.

So, as a contrived example, you might have:

if (account.isAllowed() & logAccountAndCheckFlag(account))
    // Do something

In that example, you might always want to log the fact that the owner of the account attempted to do something.

I don't think I have ever used a single & in commercial programming though.