提问人:Jan Schultke 提问时间:9/25/2023 最后编辑:Jan Schultke 更新时间:10/5/2023 访问量:332
运算符的优先级和关联性是什么?
What is the precedence and associativity of operators?
问:
C++ 中运算符的优先级和关联性是什么?
谁来定义运算符的优先级和关联性,它与评估顺序有何关系?解释这些属性是如何从语法中出现的。但是,我只是对所有规则的列表感兴趣。
这个问题应该是一个社区FAQ,可以参考它来代替cppreferences文章。
答:
8赞
8 revsJan Schultke
#1
C++ 运算符优先级
运算符/表达式 | 语法规则 | 描述 | 关联性和 灵活性 |
---|---|---|---|
0 ,,,,,,id this []{} (expression) (x, ...) requires () {} |
原发性表达 | 文字、标识符、折叠表达式、需要表达式等。这些实际上没有优先级,但却是构建其他表达式的构建块。 | 没有 |
:: |
合格的 ID | 范围解析。 严格来说也不是运算符,而是一种将多个标识符组合成一个名称的方式。:: |
从左到右 二进制 |
x++ x-- type() type{} x() x[] . , , ... -> static_cast typeid |
后缀表达式 | 后缀表达式。像这样的强制转换也被归类为后缀表达式,尽管通常人们不认为它是运算符,并且通常不会混淆它的优先级。static_cast |
从左到右 各种 |
++x ,--x +x -x !x ~x (type) x *x &x sizeof co_await new delete |
一元表达式 | 前缀表达式。这还包括 C 样式的 cast、、 和 ,并不是每个人都希望成为操作员。 请注意,操作数不能是 C 样式的强制转换,例如 解析后跟 。 co_await new delete sizeof sizeof (int)x sizeof(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) |
+ 具有更高的优先级 |
评论