条件运算符的关联性是从右到左,因此应该首先解决最右边的条件运算符(测试a是否为真),但书中提到将首先测试x。
答案 0 :(得分:2)
条件运算符与右侧相关联的事实意味着x?y:a?b:c
将被解析为好像已被写入x?y:(a?b:c)
一样。如果它与左侧相关联,它将被解析为(x?y:a)?b:c
,几乎可以肯定会感到惊讶(除非您习惯使用PHP)。
但这些括号都不会更改执行顺序。条件运算符的第一个操作数始终首先被求值。
答案 1 :(得分:1)
表达式
int result = x?y:a?b:c;
可以写为
int result;
if (x)
{
result = y;
}
else
{
if (a)
{
result = b;
}
else
{
result = c;
}
}
因此,必须首先对x
求值,以确定将执行if
块还是else
块。
请注意,三元运算符仅求值它需要的表达式。当x
为true时,将评估y
。如果x
为假,则评估子表达式a?b:c
。
实际上,C标准要求代码仅评估所需的表达式。这就是6.5.15 / p4节中的内容:
第一个操作数被求值;其之间有一个序列点 评估以及第二或第三操作数的评估 (以评估为准)。仅在以下情况下评估第二个操作数 首先比较不等于0;仅在以下情况下才对第三个操作数求值 第一个比较等于0;结果是第二个的值 或第三个操作数(以评估为准),转换为类型 如下所述。
在表达式x?y:a?b:c
中,
x
y
a?b:c
因此,标准明确禁止代码评估a?b:c
的任何部分,除非x
等于0。
关联性仅决定如何解释操作数。上面列出的第一,第二和第三操作数基于从右到左的关联性。
如果三元算子的关联性是从左到右,则
x?y:a
b
c