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

Is it guaranteed to parse as a "(a ? b : (c ? d : e))"?

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

GccClang 输出 2.

问题:

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

conditional-expression:

logical-OR-expression
logical-OR-expression ? expression : conditional-expression

因为 "condition-expression" 不是 "logical-OR-expression"(阅读:逻辑 OR 运算符具有更高的优先级)这可以防止 a ? b : c ? d : e 被解析为 (a ? b : c) ? d : e。这也意味着运算符与自身是从右到左关联的。因此它被解析为 a ? b : (c ? d : e).

更多详细信息,您可以查看运算符优先级规则here。虽然该标准是权威来源,但此 table 以更易于理解的方式列出了规则。

由于人们可能难以记住整套优先规则,并且由于不同的语言有时具有不同的优先规则,因此最好明确说明操作顺序并使用括号使您的意图更明确清除到reader.