C++ 中运算符的优先级和结合性是什么?
谁定义了运算符优先级和结合性,以及它们与求值顺序有何关系?解释了这些属性如何从语法中出现。然而,我只是对所有规则的列表感兴趣。
这个问题应该是社区常见问题解答。 Stack Overflow 上有无数的问题,本质上只是询问运算符优先级,而此问答是现场问答,可以参考而不是cppreference 文章。
运算符/表达式 | 语法规则 | 描述 | 关联性 和数量 |
---|---|---|---|
、 、 、 、 、 、
|
主要表达 | 文字、标识符、折叠表达式、require 表达式等。这些实际上没有优先级,但它们是构建其他表达式的构建块。 | 无 |
|
合格 ID | 范围分辨率。严格来说, 也不是一个运算符,而是一种将多个标识符组合成一个名称的方法。 |
从左到右 二进制 |
,
, ... |
后缀表达式 | 后缀表达式。像 这样的强制转换也被归类为后缀表达式,尽管通常人们不认为它是一个运算符,并且通常不会对其优先级产生混淆。 |
从左到右 各种 |
,
|
一元表达式 | 前缀表达式。这还包括 C 风格强制转换、 、 和 ,并非所有人都希望它们是运算符。请注意, 的操作数不能是 C 风格强制转换,例如 被解析为 后跟 。 |
从右到左 各种 |
|
下午表情 | 指向成员的指针运算符。 | 从左到右 二进制 |
|
乘法表达式 | 乘法运算符。 | |
|
加法表达式 | 加法运算符。 | |
|
shift-表达式 | 按位移位运算符。 | |
|
比较表达式 | 三向比较运算符。 | |
|
关系表达式 | 关系比较运算符。请注意, 表示 ,可能是一个错误。 |
|
|
平等表达 | 相等比较运算符。请注意, 表示 ,可能是一个错误。 |
|
|
和表达式 | 按位与运算符。 | |
|
异或表达式 | 按位异或运算符。 | |
|
包含或表达式 | 按位或运算符。 | |
|
逻辑与表达 | 逻辑与运算符。 | |
|
逻辑或表达式 | 逻辑或运算符。 | |
|
条件表达式 | 条件运算符,俗称“三元运算符”。请注意, 被解析为带括号,因此其优先级并不重要。 |
从右到左 三元 |
...
|
赋值表达式 | 常规作业和复合作业。还有yield 表达式和 throw 表达式。 | 从右到左 各种 |
|
表情 | 逗号运算符 | 从左到右 二进制 |