C++ Operator Precedence

C++运算符优先级

Translation by shy (FHBPYP)

译者:shy(FHBPYP)

*:[]内均为译者注

下表列出C++运算符的优先级和结合性。运算符已从上到下按照优先级进行降序排序。

优先级

运算符

描述

结合性

1

::

范围运算符

从左到右

2

++ --

后缀加减运算符

()

函数声明[圆括号]

[]

数组下标

.

结构体成员[分量运算符]

−>

指向结构体成员[分量运算符]

3

++ --

自增自减运算符

从右到左

+ −

加号和减号

! ~

逻辑否和逻辑非

(type)

类型转换

*

间接引用(解应用)

&

取地址

sizeof

取大小

new,new[]

生成动态变量[原译为动态分配内存]

delete,delete[]

释放生成的动态变量[原译为释放动态分配的内存]

4

.* ->*

指向元素

从左到右

5

* / %

乘,取余数,除

6

+ −

加,减

7

<< >>

左、右位移运算符

8

< <=

小于、小于等于[关系运算符]

> >=

大于、大于等于[关系运算符]

9

== !=

等于和不等于

10

&

位运算和

11

^

位运算异或(不包括or)

12

|

位运算或(包括or)

13

&&

逻辑和

14

||

逻辑或

15

?:

条件运算符[条件判断]

从右到左

16

=

直接赋值(默认为C++类)

+= −=

赋值总和,赋值差额

*= /= %=

赋值积数,商,余数

<<= >>=

赋值向左位移,向右位移

&= ^= |=

赋值逻辑和、或、异或

17

throw

Throw 运算符(用于异常)

18

,

逗号运算符

从左到右

当解析一个表达式时,某个列在上表中某些行的运算符其参数将比其他优先级远低于它的运算符被限制得更严格(好像是带有括号的)。例如,表达式std::cout<<a&b 和 *p++等同于(std::cout<<a)&b 和 *(p++), 而不等同于 std::cout<<(a&b) or (*p)++.

运算符在相同的储存单元(可能有几行储存单元中列出的运算符)求相同的优先级的数值时,在于给定的方向[结合性、排列的顺序],例如表达式a=b=c 等同于(b=c), 而不等同于(a=b)=c,原因是从右到左的结合性。

一个运算符的优先级并不受重载的影响

注释:

标准它本身并没有明确的优先级级别。这些都来源于语法。

const_cast, static_cast, dynamic_cast, reinterpret_cast 和typeid并没有包括,因为它们的优先级不是模棱两可的。

一些运算符拥有其他供选择的写法 (例如,and 对于&&, or 对于 ||, not 对于 !,等等)。

另见:

在运行时运算符的计算顺序。

普通运算符

复制

自增

自减

计算

逻辑

对比

成员

访问

其他

a = b
a = rvalue
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
(type) a
? :

特殊运算符

static_cast 将一种类型转换成另一种兼容的类型 
dynamic_cast将虚基类转换成继承类
const_cast将一个常量转换成一个非常量单位
reinterpret_cast强制将一种类型转换成另一种非兼容的类型 
new 生成动态变量
delete 释放生成的动态变量
sizeof  取一个类型或对象的大小[原译取为查询]
sizeof... 取一个参数包的大小(C++11标准)[C++0x标准]
typeid 获知一个变量的具体类型
noexcept 检查如果一个表达式抛出异常[阻止异常的传播与扩散] (C++11标准)[C++0x标准]
alignof 用于数据类型边界对齐操作(C++11标准)[C++0x标准]