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 | +a | !a | a == b | a[b] | a(...) |
特殊运算符 | ||||||
static_cast 将一种类型转换成另一种兼容的类型 |