if (a < b) {
return -1;
} else {
if (a > b) {
return 1;
} else {
return 0;
}
} if (a < b) {
return -1;
} else
if (a > b) {
return 1;
} else {
return 0;
}
Unlike your perfectly formatted code there, this has a bit of a visual problem: a one-liner consequent is fully braced, whereas a multi-line alternative isn't.Ternary operators are different. They have confusing nesting and do not support the equivalent of the "if/else ladder" pattern very well.
The nesting is irrelevant to understanding the semantics, so this objection doesn't fly. The idiom is basically just a truth table with conditions on the left and the matching value on the right. You read it left-to-right, top-to-bottom, just like all other code. The first condition on the left that matches returns the value on right-hand side.
The nesting is absolutely relevant to producing the semantics.
The following uses deceptive whitespace to suggest a nesting that is contrary to the actual nesting, interfering with understanding:
if (foo)
if (bar)
xyzzy();
else
flop();
The ternary operator A ? B : C is the goofy invention of demented mind. In nested situations, it is mind-bendingly unreadable. It behooves us to style it in a way that reveals the abstract syntax tree structure.In C, I would in fact recommend:
#define if3(a, b, c) ((a) ? (c) : (c))
return if3(a < b, -1, if3(a > b, 1, 0));
Now we can have it in one line, yet it's clear.Fortunately, the ternary pattern doesn't exhibit this problem. So again, this objection doesn't fly.
We can regard the condition as the head of a clause, and the ? and : as heads of sub-clauses:
which leads to: