如何评估x?y:a?b:c?

时间:2019-03-14 06:21:50

标签: c

条件运算符的关联性是从右到左,因此应该首先解决最右边的条件运算符(测试a是否为真),但书中提到将首先测试x。

2 个答案:

答案 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