TLDR:
T && X is equivalent to "if( T) then run X"
T || X is equivalent to "if(!T) then run X"
I don’t exploit this too much in C/C++ because it’s hard to read (and therefore hard to keep track of it to make sure it’s bug free) and most often I’m interested in the output value so I have to watch out for the side effects. However this is common in Bash scripts
Domination Property
In languages that expressions evaluates to a value, sometimes if-statements can be replaced by short-circuit evaluation because short-circuit evaluation exploits the domination property of AND and OR logic operations:
\newcommand{\Hquad}{\hspace{0.5em}} \begin{alignat*}{2} 0 \Hquad & \mathrm{AND} & \Hquad X = 0 \\ 1 \Hquad & \mathrm{OR} & \Hquad X = 1 \end{alignat*}
When you FIRST run into the dominant value for the binary operation (0 for AND) and (1 for OR), evaluate no further (i.e. skip the rest) because rest won’t change the overall result away from the dominant value.
So in this use case (emulating if-then statements), what the latter expression X evaluates to or what the combined logic value is irrelevant. We are merely tricking the short-circuit mechanism to trip (short) to NOT evaluate based on what the earlier expression turned out. Action is the ‘norm’. Conditional inaction is the essence of this idiom.
The dual of domination property is idempotent, which is easier to reason because if pre-condition (say T) forces overall expression to boil down to the expression we want to conditionally execute (say X), we are stuck evaluating X if condition T is met.
\newcommand{\Hquad}{\hspace{0.5em}} \begin{alignat*}{2} 1 \Hquad & \mathrm{AND} & \Hquad X = X \\ 0 \Hquad & \mathrm{OR} & \Hquad X = X \end{alignat*}
These 2 possibilities (domination and idempotency) partitions to space (choices) of possibilities (i.e. cover all possible combinations), in other words there are no other scenarios than described. So the precondition T decides whether you run X or not, which is the equivalent of an if-then statement.
Operator (function) view of logic domination [Functional programming perspective]
By grouping the first value and the binary logic operator with a pair of parenthesis, in dominance view
- (0 AND) is also called the ‘clear’ operator
- (1 OR) is also called the ‘set’ operator
but this view is not too interesting for our case because we are not interested in what the conditional expression and the overall expression evaluates to, which is signified by ‘clear’ and ‘set’.
On the other hand, (1 AND) and (0 OR) are pass-through (idempotent) operators which passes the evaluation to the latter expression X.
\newcommand{\Hquad}{\hspace{0.5em}} \begin{alignat*}{2} (1 \Hquad & \mathrm{AND}) \Hquad & \circ & \Hquad X = X \\ (0 \Hquad & \mathrm{OR}) \Hquad & \circ & \Hquad X = X \end{alignat*}
This reads
- (1 AND): pass-through (evaluate latter expression) if (earlier expression is) TRUE
- (0 OR): pass-through (evaluate latter expression) if (earlier expression is) FALSE
Let’s call T the condition to test (the ‘if’-condition). The expression to run remain X.
\newcommand{\Hquad}{\hspace{0.5em}} \begin{alignat}{2} (T \Hquad \mathrm{AND}) X & = \overline{f_T}(X) \\ (T \Hquad \mathrm{OR}) X & = f_T(X) \end{alignat}
where
- \overline{f_T} reads “Run if T is false”
- f_T reads “Run if T is true”.