补充内容:运算符优先级
运算符优先级决定了运算符对于值的顺序。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级 |
||
, |
从左到右 |
将两个表达式合并成一个 |