是否保证解析为“(a?b:(c?d:e))”?

时间:2018-06-05 11:21:54

标签: c ternary-operator conditional-operator

假设,如果我使用这样的三元运算符:a ? b : c ? d : e

代码:

#include <stdio.h>

int main()
{
    int a=1,b=2,c=3,d=4,e=5;
    printf("%d\n", a ? b : c ? d : e);
    return 0;
}

Gcc Clang 提供输出2

问题:

  • 是否可以保证解析为(a ? b : (c ? d : e))?或
  • 这是不明确的行为吗?
  • C标准对此有何评论?

1 个答案:

答案 0 :(得分:7)

三元运算符的语法,也称为条件表达式,在C standard的6.5.15节中定义如下:

  

条件表达式:

     
    

逻辑OR-表达
      逻辑OR表达?表达式:条件表达式

  

因为“condition-expression”不是“逻辑OR表达式”(读取:逻辑OR运算符具有更高的优先级),这会阻止a ? b : c ? d : e被解析为(a ? b : c) ? d : e。这也意味着操作员从右到左与自身相关联。因此它被解析为a ? b : (c ? d : e)

有关详细信息,您可以找到运算符优先级规则here。虽然标准是权威来源,但此表以更容易理解的方式列出规则。

由于人们很难记住完整的优先规则,并且因为不同的语言有时会有不同的优先规则,所以最好明确操作的顺序,并使用括号使你的意图更清晰。读者。