C++ 运算符优先级

http://en.cppreference.com/w/cpp/language/operator_precedence


The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.

Precedence Operator Description Associativity
1::Scope resolution Left-to-right
2 ++   -- Suffix/postfix increment and decrement (a++)
() Function call
[] Array subscripting
. Element selection by reference
−> Element selection through pointer
3 ++   -- Prefix increment and decrement (++a) Right-to-left
+    Unary plus and minus
!   ~ Logical NOT and bitwise NOT
(type) Type cast
* Indirection (dereference)
& Address-of
sizeof Size-of
newnew[] Dynamic memory allocation
deletedelete[] Dynamic memory deallocation
4.*   ->*Pointer to member Left-to-right
5*   /   %Multiplication, division, and remainder
6+   Addition and subtraction
7<<   >>Bitwise left shift and right shift
8 <   <= For relational operators < and ≤ respectively
>   >= For relational operators > and ≥ respectively
9==   !=For relational = and ≠ respectively
10&Bitwise AND
11^Bitwise XOR (exclusive or)
12|Bitwise OR (inclusive or)
13&&Logical AND
14||Logical OR
15 ?: Ternary conditional Right-to-left
= Direct assignment (provided by default for C++ classes)
+=   −= Assignment by sum and difference
*=   /=   %= Assignment by product, quotient, and remainder
<<=   >>= Assignment by bitwise left shift and right shift
&=   ^=   |= Assignment by bitwise AND, XOR, and OR
16throwThrow operator (for exceptions)
17,CommaLeft-to-right

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 asstd::cout<<(a&b) or (*p)++.

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.

An operator's precedence is unaffected by overloading.

### C++ 运算符优先级C++运算符优先级定义了表达式中各运算符的计算顺序。当一个复杂表达式包含多个运算符时,优先级较高的运算符会先被执行[^1]。 以下是完整的 C++ 运算符优先级列表(从高到低排列),涵盖了大部分常见的运算符: #### 单目运算符 | 优先级 | 类型 | 运算符 | |--------|--------------------|---------------------------------| | 1 | 后缀 | `()`, `[]`, `->`, `.`, `postfix ++`, `postfix --`[^5] | | 2 | 前缀 | `prefix ++`, `prefix --`, `+`, `-`, `!`, `~`, `(type)`, `*`, `&`, `sizeof`, `new`, `delete`[^3] | #### 多目运算符 | 优先级 | 类型 | 运算符 | |--------|------------------|------------------------------| | 3 | 成员访问 | `.*`, `->*` | | 4 | 求值 | `*`, `/`, `%` | | 5 | 加减法 | `+`, `-` | | 6 | 移位操作 | `<<`, `>>` | | 7 | 关系比较 | `<`, `>`, `<=`, `>=` | | 8 | 相等性判断 | `==`, `!=` | | 9 | 逻辑与 | `&` | | 10 | 逻辑异或 | `^` | | 11 | 逻辑或 | `\|` | | 12 | 条件测试 | `&&` | | 13 | 或者条件测试 | `\|\|` | | 14 | 条件表达式 | `?:` | | 15 | 赋值 | `=`, `+=`, `-=` , `*=` , `/=`, etc.| 需要注意的是,在某些情况下,即使知道了运算符优先级,仍然可能需要通过显式的括号来改变默认的求值顺序[^4]。 对于 C++17 及之后的标准版本新增的一些特殊用途运算符未在此表格中列出,例如三向比较运算符 (`<=>`) 等[^2]。 ```cpp // 示例代码展示如何利用优先级解析表达式 int a = 5, b = 3; bool result = (a + b * 2 >= 10 && !(b < 2)); // 正确理解此语句需掌握优先级规则 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值