By now, you may have noticed this already, but it’s so important that it merits an article of its own: there are some instances in which you don’t care—so you don’t even compute—what certain expressions’ values are.
Suppose you have something like:
if(isMonday || isWednesday || isFriday){
// stuff
}
Then, knowing that || means logical-or (so this means, in English, “if today is
Monday, Wednesday, or Friday…”), one might look at the truth table for OR. The
truth table contains all the possible inputs and their corresponding outputs:
For “OR”, that looks like:
|
Var1 |
Var2 |
Result |
|
TRUE |
TRUE |
TRUE |
|
TRUE |
FALSE |
TRUE |
|
FALSE |
TRUE |
TRUE |
|
FALSE |
FALSE |
FALSE |
That is, 2-way logical OR is false only if BOTH are false (3-, 4-way, etc., would only be false if ALL are false). Put another way, if ANY
are true, then OR is true.
AND, likewise, has a table.
|
Var1 |
Var2 |
Result |
|
TRUE |
TRUE |
TRUE |
|
TRUE |
FALSE |
FALSE |
|
FALSE |
TRUE |
FALSE |
|
FALSE |
FALSE |
FALSE |
For a logical AND to return true, both things being AND-ed must be true (likewise for multi-way AND, ALL must be true for it to be true; any falses cause an overall false). If BOTH
are true, then AND is true; if ANY are false, then AND is false.
Back to our day-of-the-week example, once we see that any
day matches with today, we don’t have to look at any of the other checks, since
the expression is entirely OR-based. Just the fact that one of those is true,
provided that they’re all connected by OR, is enough to make the whole
expression true, and we can jump into whatever code is prescribed for that case.
Similarly, in a situation where
if(is16OrOlder && hasLicense && noRestrictions
&& carIsWorking){
// do stuff
}
If any of these are found to be false, we don’t need to check
the others. AND works in such a way that, unless all chained ANDs are true, the
whole thing is false.
This is a simple and incredibly common logical optimization in Java performed
at the compiler level, known as short-circuit evaluation. If you have a sophisticated
IDE, it will also probably tell you if it finds any variables that can be
short-circuited. IntelliJ, at least in light mode, highlights such expressions
in a sepia-like color (which it also uses for infinite loops, or loops that don’t
loop).