C++ 操作符优先级

来自cppreference.com
< cpp‎ | language


 
 
C++ 语言
表达式
运算符
运算符优先级
替代表示
字面量
布尔 - 整数 - 浮点
字符 - 字符串 - nullptr (C++11)
用户定义 (C++11)
工具设施
特性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
隐式类型转换 - 显式类型转换
static_cast - dynamic_cast
const_cast - reinterpret_cast
内存分配
类特有的函数属性
特殊成员函数
模板
杂项
 

下表列出了C++运算符的优先级和结合性。从上到下,运算符的优先级下降.

优先级 操作符 描述 结合性
1 :: 作用域解析 从左到右
2 ++   -- 后缀 自增、自减
() 函数调用
[] 数组下标
. 通过引用选择成员
−> 通过指针选择成员
3 ++   -- 前缀 自增、自减 从右到左
+   正、负
!   ~ 逻辑非、按位非
(type) 显式类型转换
* 解引用
& 取地址
sizeof 取对象大小
new, new[] 动态内存分配
delete, delete[] 动态内存去分配
4 .*   ->* 成员指针运算符 从左到右
5 *   /   % 乘、除、求余
6 +   加、减
7 <<   >> 按位左移、按位右移
8 <   <= 小于、小于或等于
>   >= 大于、大于或等于
9 ==   != 等于、不等于
10 & 按位与
11 ^ 按位异或
12 | 按位或
13 && 逻辑与
14 || 逻辑或
15 ?: 三目运算符 从右到左
= 赋值
+=   −= 加法/减法赋值运算符
*=   /=   %= 乘法/除法/取余赋值运算符
<<=   >>= 按位左移/右移赋值运算符
&=   ^=   |= 按位与/异或/或赋值运算符
throw 抛出异常
17 , 逗号 从左到右
解析表达式时,操作员是列出的一些行会的约束更严格的(如果用括号),其参数比任何操作上列出它下面的一排。例如,表达式std::cout<<a&b*p++被解析为(std::cout<<a)&b*(p++),而不是作为std::cout<<(a&b)(*p)++.
原文:
When parsing an expression, an operator which is listed on some row will be bound tighter (as if by parentheses) to its arguments than any operator that is listed on a row further below it. For example, the expressions std::cout<<a&b and *p++ are parsed as (std::cout<<a)&b and *(p++), and not as std::cout<<(a&b) or (*p)++.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
在同一单元中列出的运算符,求值时在给定的方向上具有相同的优先级。例如,表达式a=b=c被解析为a=(b=c),而不是(a=b)=c,因为从右到左的结合性.
原文:
Operators that are in the same cell (there may be several rows of operators listed in a cell) are evaluated with the same precedence, in the given direction. For example, the expression a=b=c is parsed as a=(b=c), and not as (a=b)=c because of right-to-left associativity.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

运算符的优先级不受重载的影响。

[编辑] 注释

标准本身并没有指定优先级。它们从语法派生。
原文:
The standard itself doesn't specify precedence levels. They are derived from the grammar.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
const_caststatic_castdynamic_castreinterpret_casttypeid不包括在内,因为它们永远不会有歧义.....
原文:
const_cast, static_cast, dynamic_cast, reinterpret_cast and typeid are not included since they are never ambiguous.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
一些运算符有替代拼写方式(例如,and&&or||not!等).
原文:
Some of the operators have 替代拼写方式 (e.g., and for &&, or for ||, not for !, etc.).
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 另请参阅

求值的顺序运行时运算符参数
原文:
求值的顺序 of operator arguments at run time.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
普通运算符
赋值 自增
自减
算术 逻辑 比较 成员访问 其他

a = b
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
? :

特殊运算符

static_cast 将一个类型转换为另一个相关类型
dynamic_cast 在继承层次中进行转换
const_cast 添加或移除 cv 限定符
reinterpret_cast 将类型转换为无关的类型
C 风格的强制转换通过混合 static_castconst_castreinterpret_cast 将一个类型转换为另一个类型
new 分配内存
delete 回收内存
sizeof 查询类型的大小
sizeof... 查询形参包的大小(C++11 起)
typeid 查询类型的类型信息
noexcept 检查表达式是否会抛出异常(C++11 起)
alignof 查询类型的对齐要求(C++11 起)