我可以理解为什么赋值运算符是正确关联的。
时有意义x = 4 + 3
评估,在分配给x之前添加4和3。
我不清楚?:
如何从正确的联想中受益。是否只使用了两个?:
这样的
z = (a == b ? a : b ? c : d);
然后评估如下:
z = (a == b ? a : (b ? c : d));
从左到右进行评估肯定会更有意义吗?
答案 0 :(得分:40)
如果从左到右进行评估,它看起来像这样:
z = ((a == b ? a : b) ? c : d);
也就是说,它将使用第一个条件(a
或b
)的结果作为第二个条件的布尔条件。这没有多大意义:就像说:
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
。
关联性与评估顺序无关。