补充内容:运算符优先级
运算符优先级决定了运算符对于值的顺序。C++运算符分为18个优先级组,如下表所示。第一组的运算符的优先级就高,第二组中运算符的优先级次之,以此类推。如果两个运算符被用于同一个操作数,则首先应用优先级高得运算符。如果两个运算符的优先级相同,则C++使用结合性规则来决定哪个运算符结合得更为紧密。同一组中运算符的优先级和结合性相同。不管是从左到右还是从右到左结合,从左到右的结合性意味着首先应用最左边的运算符,而从右到左的结合性意味着首先应用最右边的运算符。
C++运算符的优先级和结合性
运算符 | 结合性 | 含义 |
优先级第1组 | ||
:: |
| 作用域解析运算符 |
优先级第2组 | ||
() | 从左到右 | 函数调用 |
() | 从左到右 | 值构造,即type(expr) |
[ ] | 从左到右 | 数字下标 |
-> | 从左到右 | 间接成员运算符 |
. | 从左到右 | 直接成员运算符 |
const_cast | 从左到右 | 专用的类型转换 |
dynamic_cast | 从左到右 | 专用的类型转换 |
reinterpret_cast | 从左到右 | 专用的类型转换 |
static_cast | 从左到右 | 专用的类型转换 |
typeid | 从左到右 | 类型标识 |
++ | 从左到右 | 加1运算符,后缀 |
-- | 从左到右 | 减1运算符,后缀 |
优先级第3组(全是一元运算符) | ||
! | 从右到左 | 逻辑非 |
~ | 从右到左 | 位非 |
+ | 从右到左 | 一元加号(正号) |
- | 从右到左 | 一元减号(负号) |
++ | 从右到左 | 加1运算符,前缀 |
-- | 从右到左 | 减1运算符,前缀 |
& | 从右到左 | 地址 |
* | 从右到左 | 解除引用(间接值) |
() | 从右到左 | 类型转换,即(type)expr |
sizeof | 从右到左 | 长度,以字节为单位 |
new | 从右到左 | 动态分配内存 |
new[] | 从右到左 | 动态分配数组 |
delete | 从右到左 | 动态释放内存 |
delete[] | 从右到左 | 动态释放数组 |
优先级第4组 | ||
.* | 从左到右 | 成员解除引用 |
->* | 从左到右 | 间接成员解除引用 |
优先级第5组(全是二元运算符) | ||
* | 从左到右 | 乘 |
/ | 从左到右 | 除 |
^ | 从左到右 | 模(余数) |
优先级第6组(全是二元运算符) | ||
+ | 从左到右 | 加 |
- | 从左到右 | 减 |
优先级第7组 | ||
<< | 从左到右 | 左移 |
>> | 从左到右 | 右移 |
优先级第8组 | ||
< | 从左到右 | 小于 |
<= | 从左到右 | 小于或等于 |
>= | 从左到右 | 大于或等于 |
> | 从左到右 | 大于 |
优先级第9组 | ||
== | 从左到右 | 等于 |
!= | 从左到右 | 不等于 |
优先级第10组(一元运算符) | ||
& | 从左到右 | 按位AND |
优先级第11组 | ||
^ | 从左到右 | 按位XOF(异或) |
优先级第12组 | ||
| | 从左到右 | 按位OR |
优先级第13组 | ||
&& | 从左到右 | 逻辑AND |
优先级第14组 | ||
|| | 从左到右 | 逻辑OR |
优先级第15组 | ||
:? | 从右到左 | 条件 |
优先级第16组 | ||
= | 从右到左 | 简单赋值 |
*= | 从右到左 | 乘并赋值 |
/= | 从右到左 | 除并赋值 |
%= | 从右到左 | 求模并赋值 |
+= | 从右到左 | 加并赋值 |
-= | 从右到左 | 减并赋值 |
&= | 从右到左 | 按位AND并赋值 |
^= | 从右到左 | 按位XOR并赋值 |
!= | 从右到左 | 按位OR并赋值 |
<<= | 从右到左 | 左移并赋值 |
>>= | 从右到左 | 右移并赋值 |
优先级第17级 | ||
throw | 从左到右 | 引发异常 |
优先级第18级 | ||
, | 从左到右 | 将两个表达式合并成一个 |