Why is the conditional operator right associative?
If it evaluated from left to right, it'd look like this:
z = ((a == b ? a : b) ? c : d);
That is, it would use the result of the first conditional (a
or b
) as the boolean condition of the second conditional. That doesn't make much sense: that's like saying:
int z, tmp;/* first conditional */if(a == b) tmp = a;else tmp = b;/* second conditional */if(tmp) z = c;else z = d;
While perhaps one day you'll want to do exactly this, it's far more likely that each ?:
that follows is meant to add more conditions, like if
/ else if
/ else if
/ else
, which is what the right-associative binding yields:
int z;/* first conditional */if(a == b) z = a;else /* second conditional */ if(b) z = c;else z = d;
In any language with a right associative ternary operator, you can stack them and build an if-elseif-elseif-else expression, like this:
val = a == 0 ? 1: a == 1 ? 2: 4;
On the contrary, in languages with a left associative ternary operator (such as PHP, thanks @user786653) you need to explicitly enforce the aforementioned intent with parentheses:
<?php// This will output 't', not 'true'.echo (true ? 'true' : false ? 't' : 'f');// the following is a more obvious version of the same code as aboveecho ((true ? 'true' : false) ? 't' : 'f');// here, you can see that the first expression is evaluated to 'true', which// in turn evaluates to (bool)true, thus returning the true branch of the// second ternary expression.?>
You got the concept of associativity wrong.
When operator +
is said to be left-associative, this means that a + b + c
is equivalent to (a + b) + c
, as opposed to a + (b + c)
.
The operator =
is right-associative, which means that a = b = c
is equivalent to a = (b = c)
, as opposed to (a = b) = c
.
Associativity has nothing to do with the order of evaluation.