运算符的优先级和关联性是什么?

What is the precedence and associativity of operators?

提问人:Jan Schultke 提问时间:9/25/2023 最后编辑:Jan Schultke 更新时间:10/5/2023 访问量:332

问:

C++ 中运算符的优先级和关联性是什么?

谁来定义运算符的优先级和关联性,它与评估顺序有何关系?解释这些属性是如何从语法中出现的。但是,我只是对所有规则的列表感兴趣。


这个问题应该是一个社区FAQ,可以参考它来代替cppreferences文章

C 语法 运算符优先级 C++-FAQ

评论


答:

8赞 8 revsJan Schultke #1

C++ 运算符优先级

运算符/表达式 语法规则 描述 关联性和
灵活性
0,,,,,,

idthis[]{}(expression)(x, ...)
requires () {}
原发性表达 文字、标识符、折叠表达式、需要表达式等。这些实际上没有优先级,但却是构建其他表达式的构建块。 没有
:: 合格的 ID 范围解析。 严格来说也不是运算符,而是一种将多个标识符组合成一个名称的方式。:: 从左到右
二进制
x++ x--
type() type{}
x() x[]
., ,

...
->static_casttypeid
后缀表达式 后缀表达式。像这样的强制转换也被归类为后缀表达式,尽管通常人们不认为它是运算符,并且通常不会混淆它的优先级。static_cast 从左到右
各种
++x,--x
+x -x
!x ~x
(type) x
*x &x
sizeof
co_await
new
delete
一元表达式 前缀表达式。这还包括 C 样式的 cast、、 和 ,并不是每个人都希望成为操作员。

请注意,操作数不能是 C 样式的强制转换,例如 解析后跟 。
co_awaitnewdeletesizeofsizeof (int)xsizeof(int)x
从右到左
的各种
.* ->* pm-表达式 指向成员的指针运算符。 从左到右
二进制
* / % 乘法表达式 乘法运算符。
+ - 加法表达式 加法运算符。
<< >> shift-表达式 按位移位运算符。
<=> 比较表达式 三向比较运算符。
< >
<= >=
关系表达式 关系比较运算符。请注意,这意味着并且可能是一个错误。a < b < c(a < b) < c
== != 平等表达 相等比较运算符。请注意,这意味着并且可能是一个错误。a == b == c(a == b) == c
& 和表达式 按位 AND 运算符。
^ exclusive-or-expression 按位 XOR 运算符。
| 包含或表达 按位 OR 运算符。
&& 逻辑和表达式 逻辑 AND 运算符。
|| 逻辑或表达式 逻辑 OR 运算符。
a?b:c 条件表达式 条件运算符,俗称“三元运算符”。请注意,它被解析为好像它被括起来了,所以它的优先级无关紧要。b 从右到左
三元
= +=...
co_yield
throw
赋值表达式 常规分配和复合分配。还有 yield expression 和 throw 表达式。 从右到左
的各种
, 表达 逗号运算符 从左到右
二进制

请注意,此列表同样适用于 C 中的运算符优先级。 C++ 规则是 C 规则的超集,这意味着它们是相同的,只是运算符更多。

常见示例

表达 括号内 解释
x + y * z x + (y * z) *具有更高的优先级
x + y + z (x + y) + z +是左联想的
x = y = z x = (y = z) =是右联想的
x || y && z x || (y && z) &&具有更高的优先级
(这使得析取范式易于
编写)
x || y || z (x || y) || z ||是左联想的
x = y ? a : b x = (y ? a : b) ?:具有更高的优先级,
并且是右联想的
*x++ *(x++) 后缀表达式具有更高的优先级
*++x *(++x) 前缀表达式是右关联的
x | y << z x | (y << z) <<具有更高的优先级
cout << x ? y : z (cout << x) ? y : z <<具有更高的优先级
x << y + z x << (y + z) +具有更高的优先级

另请参阅其他网站