代码之家  ›  专栏  ›  技术社区  ›  msc

是否保证解析为“(a”?乙:(C)?D:E)?

  •  2
  • msc  · 技术社区  · 6 年前

    假设,如果我使用这样的三元运算符: 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;
    }
    

    海湾合作委员会 铿锵声 输出 2 .

    问题:

    • 是否保证解析为 (a ? b : (c ? d : e)) ?或
    • 这是未指明的行为吗?
    • C标准是怎么说的?
    1 回复  |  直到 6 年前
        1
  •  7
  •   dbush    6 年前

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

    条件表达式:

    逻辑或表达式
    逻辑还是表达?表达式:条件表达式

    因为“条件表达式”不是“逻辑或表达式”(读:逻辑或运算符具有更高的优先级),这可以防止 a ? b : c ? d : e 从被解析为 (a ? b : c) ? d : e . 这也意味着操作符是自右向左关联的。因此它被解析为 a ? b : (c ? d : e) .

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

    由于人们很难记住全套优先规则,而且由于不同的语言有时有不同的优先规则,所以最好对操作顺序进行明确说明,并使用括号使读者更清楚地了解您的意图。