Simplify Ternary Operators
One of my pet peeves in C/C++/C#/Java programming is the use of the ternary operator ?:
with boolean values. It’s almost always redundant, makes code harder to read and can be easily replaced by a simpler boolean expression that also has the advantage of being “branch-free” in some languages, that is, do not require the CPU to select a path of execution based on a condition, which can be fairly expensive. The best compilers will optimize them away in a manner similar to what I describe here, but they still don’t improve code readability.
From this point onward I’ll be using the C/C++/C#/Java code syntax. A boolean expression is any valid expression that results in a boolean value. This may be anything from the constants true
and false
all the way to complex expressions such as x == 1 && (y > 3 || z <= 1.25) && !checkSomething(x, y, z)
(assuming checkSomething(...)
returns or can be coerced to a boolean).
Say you have the condition c
and the boolean expressions p
and q
. The following table contains all possible conversions from a ternary expression to an equivalent boolean expression:
# | Ternary Expression | if-then-else Expression | Equivalent to |
---|---|---|---|
1 | c ? p : q |
if (c) p else q |
(c && p) || (!c && q) |
2 | c ? p : true |
if (c) p else true |
!c || p |
3 | c ? p : false |
if (c) p else false |
c && p |
4 | c ? true : p |
if (c) true else p |
c || p |
5 | c ? false : p |
if (c) false else p |
!c && p |
6 | c ? true : false |
if (c) true else false |
c |
7 | c ? false : true |
if (c) false else true |
!c |
8 | c ? true : true |
if (c) true else true |
true |
9 | c ? false : false |
if (c) false else false |
false |
Note that #1 may or may not result in more readable code; it is probably better to use the ternary operator in that case. #6 through #9 are poor coding practices and should be replaced as soon as possible by their equivalent boolean expressions. #2 through #5 require attention and almost certainly will result in better, cleaner code.
Also note that b = c ? p : q
is equivalent to if (c) b=p else b=q
. In other words, if any boolean variables are assigned a value that depends on the condition of an if-then-else clause, then that value can be simplified according to the equivalence table above, as long as there are no unintended side-effects. Let’s take a look at an example:
boolean b = (i > 5) ? (j == 3) : false;
or, as an if-then-else clause:
boolean b;
if (i > 5) {
b = (j == 3);
} else {
b = false;
}
This matches expression #3, with: c = (i > 5)
and p = (j == 3)
. The equivalent expression would be:
boolean b = (i > 5) && (j == 3)
which is slightly shorter and certainly less confusing than the above ternary or if-then-else statements.
It is interesting to note that certain IDEs (such as IntelliJ IDEA) will suggest simplifications of such overcomplicated ternary expressions:
IntelliJ IDEA suggests a simplification of a complicated ternary expression