为什么条件运算符是正确关联的?

时间:2011-09-13 19:22:33

标签: c conditional-operator

我可以理解为什么赋值运算符是正确关联的。

时有意义
x = 4 + 3
评估

,在分配给x之前添加4和3。

我不清楚?:如何从正确的联想中受益。是否只使用了两个?:这样的

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

然后评估如下:

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

从左到右进行评估肯定会更有意义吗?

3 个答案:

答案 0 :(得分:40)

如果从左到右进行评估,它看起来像这样:

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

也就是说,它将使用第一个条件(ab)的结果作为第二个条件的布尔条件。这没有多大意义:就像说:

int z, tmp;
/* first conditional */
if(a == b) tmp = a;
else       tmp = b;
/* second conditional */
if(tmp) z = c;
else    z = d;

虽然也许有一天你会想要做到这一点,但后面的每个?:更有可能增加更多条件,例如if / else if / { {1}} / else if,这是右关联绑定产生的结果:

else

答案 1 :(得分:20)

在任何具有右关联三元运算符的语言中,您可以堆叠它们并构建if-elseif-elseif-else表达式,如下所示:

val = a == 0 ? 1:
      a == 1 ? 2:
               4;

相反,在具有左关联三元运算符的语言中(例如PHP,感谢@ user786653),您需要使用括号明确强制执行上述意图:

<?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.
?>

答案 2 :(得分:4)

你的关联概念是错误的。

如果说操作符+是左关联的,则表示a + b + c相当于(a + b) + c,而不是a + (b + c)

运营商=是右关联的,这意味着a = b = c相当于a = (b = c),而不是(a = b) = c

关联性与评估顺序无关。