Why is the conditional operator right associative?

感情迁移 提交于 2019-12-17 06:37:29

问题


I can understand why the assignment operator is right associative. It makes sense that when

x = 4 + 3

is evaluated, that 4 and 3 are added before being assigned to x.

I am unclear as to how ?: would benefit from being right associative. Does it only matter when two ?:s were used like this

z = (a == b ? a : b ? c : d);

Then it is evaluated like this:

z = (a == b ? a : (b ? c : d));

Surely it would make more sense to evaluate from left to right?


回答1:


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;



回答2:


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 above
echo ((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.
?>



回答3:


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.



来源:https://stackoverflow.com/questions/7407273/why-is-the-conditional-operator-right-associative

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!