C++ conditional ternary operators, evaluate more than one expression
27 May 2021Even since I have learned about C++’s conditional ternary operators I have been using the heck out of them to create short code where if
/ then
loops would have been before.
The operator is the question mark, ?
, and you use it like so:
condition ? result1 : result2
The equivalent if
/ then
is:
if (condition == true){
result1;
} else {
result2;
}
There’s more detail at www.cplusplus.com, at the ‘conditional ternary operators’ section.
Something I do very frequently: iterating through a loop, load an image, do things with it, need to record some things. In this case it is the min / max of rows / cols of some features.
im.rows > max_rows ? max_rows = im.rows : 0;
im.rows < min_rows ? min_rows = im.rows : 0;
im.cols > max_cols ? max_cols = im.cols : 0;
im.cols < min_cols ? min_cols = im.cols : 0;
I do this kind of thing a lot. There is no result2
, or else
to my conditional, so I just put 0
.
But, I wanted to alter this code to record the index that triggered the update of the min / max values. In other words, I wanted two expressions instead of one to be evaluated.
It turns out I can do this with the comma operator! (The next operator down at www.cplusplus.com from the conditional ternary operator.) Where one expression is expected, join two together with a comma and enclose with parentheses.
So I can alter my four lines as follows:
im.rows > max_rows ? (max_rows = im.rows, max_row_index = i) : 0;
im.rows < min_rows ? (min_rows = im.rows, min_row_index = i) : 0;
im.cols > max_cols ? (max_cols = im.cols, max_col_index = i) : 0;
im.cols < min_cols ? (min_cols = im.cols, min_col_index = i) : 0;