是否保证解析为“(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;
}
Gcc 和 Clang 输出 2
.
问题:
- 是否保证解析为
(a ? b : (c ? d : e))
?或
- 这是未指定的行为吗?
- C 标准对此有何规定?
三元运算符的语法,也称为 条件表达式 ,在 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.
假设,如果我像这样使用三元运算符: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 标准对此有何规定?
三元运算符的语法,也称为 条件表达式 ,在 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.