Operator Precedence
C++算子优先
下表列出了C++操作符的优先级和相联性。运算符从上到下列出,按降序排列。
Precedence | Operator | Description | Associativity |
---|---|---|---|
1 | :: | Scope resolution | Left-to-right |
2 | a++ a-- | Suffix/postfix increment and decrement | |
type() type{} | Functional cast | ||
a() | Function call | ||
a[] | Subscript | ||
. -> | Member access | ||
3 | ++a --a | Prefix increment and decrement | Right-to-left |
+a -a | Unary plus and minus | ||
! ~ | Logical NOT and bitwise NOT | ||
(type) | C-style cast | ||
*a | Indirection (dereference) | ||
&a | Address-of | ||
sizeof | Size-ofnote 1 | ||
new new[] | Dynamic memory allocation | ||
delete delete[] | Dynamic memory deallocation | ||
4 | .* ->* | Pointer-to-member | Left-to-right |
5 | a*b a/b a%b | Multiplication, division, and remainder | |
6 | a+b a-b | Addition and subtraction | |
7 | << >> | Bitwise left shift and right shift | |
8 | < <= | For relational operators < and ≤ respectively | |
= | For relational operators > and ≥ respectively | ||
9 | == != | For relational operators = and ≠ respectively | |
10 | a&b | Bitwise AND | |
11 | ^ | Bitwise XOR (exclusive or) | |
12 | | | Bitwise OR (inclusive or) | |
13 | && | Logical AND | |
14 | || | Logical OR | |
15 | a?b:c | Ternary conditionalnote 2 | Right-to-left |
throw | throw operator | ||
= | Direct assignment (provided by default for C++ classes) | ||
+= -= | Compound assignment by sum and difference | ||
*= /= %= | Compound assignment by product, quotient, and remainder | ||
<<= >>= | Compound assignment by bitwise left shift and right shift | ||
&= ^= |= | Compound assignment by bitwise AND, XOR, and OR | ||
16 | , | Comma | Left-to-right |
- 操作数
sizeof
%27T是C样式类型的强制转换:表达式sizeof (int) * p
被明确解释为(sizeof(int)) * p
,但不是sizeof((int)*p)
...
- 条件运算符%28中间的表达式
?
和:
%29被解析为圆括号:它的优先级相对于?:
被忽视了。
在解析表达式时,如果用括号将%29绑定到其参数上,则在具有优先级的上表的某一行上列出的运算符将绑定得更紧一些,如果它的参数比在其下面更低优先级的行上列出的任何运算符都要严格绑定。例如,表达式std::cout<< a & b和*p++被解析为(std::cout<< a)& b*(p++),而不是std::cout<<(a & b)或(*p)++...
具有相同优先级的运算符按其结合性的方向绑定到它们的参数。例如,表达式a = b = c
被解析为a = (b = c)
,而不是(a = b) = c
因为任务的左右结合,但是a + b - c
被解析(a + b) - c
而不是a + (b - c)
因为左向右相加相减的结合。
关联规范对于一元运算符来说是多余的,只有在完整性时才显示:一元前缀运算符总是将右向左的%28相关联。delete ++*p
是delete(++(*p))
%29和一元后缀运算符总是将左向右关联为%28。a[1][2]++
是((a[1])[2])++
29%。请注意,即使成员访问操作符与一元后缀运算符分组,关联对于成员访问操作符也是有意义的:a.b++
被解析(a.b)++
而不是a.(b++)
...
运算符优先级不受操作者超载例如,std::cout<< a ? b : c;解析为(std::cout<< a)? b : c;因为算术左移的优先级高于条件运算符。
注记
优先级和结合性是编译时的概念,独立于评价顺序,这是一个运行时概念。
标准本身不指定优先级别(%27T)。它们是从语法中派生出来的。
const_cast
,,,static_cast
,,,dynamic_cast
,,,reinterpret_cast
,,,typeid
,,,sizeof...
,,,noexcept
和alignof
都不包括在内,因为它们从不含糊。
一些运营商交替拼写%28E.。g.and
为&&
,,,or
为||
,,,not
为!
,等.%29.
三元条件和赋值算子的相对优先级在C和C++之间不同:在C中,在三元条件运算符的右侧不允许赋值,因此e = a < d ? a++ : a = d不能被解析。许多C编译器使用修改过的语法?:比=,它将其解析为e = ( ((a < d) ? (a++) : a) = d )%28然后无法编译,因为?:在C和=要求左%29的值。在C++中,?:和=具有平等的优先权和从右到左的分组,以便e = a < d ? a++ : a = d解析为e = ((a < d) ? (a++) : (a = d))...
另见
公共算子
*。
分配增量递减算术逻辑比较成员访问其他
a=b a+=b a-=b a%2A=b a/=b a%=b a&=b a=b a^=b a<=b a>>=b.+a-a+a-+a-+a-a+b a-b a%2Ab a/b a%b~a&b ab^b a<<b a>>b.%21 a&b a&b ab a=b a%21=b a<b a>b a<=b a>=b a乙%2AA&A->b A.B a->%2Ab a.%2AA%28...%29 a,b?*
特殊运算符
静态[医]强制转换将一种类型转换为另一种相关类型动态。[医]继承层次结构中的强制转换[医]强制转换添加或删除cv限定符,重新解释[医]CAST将类型转换为不相关的类型C风格的强制转换通过混合静态方式将一种类型转换为另一种类型[医]卡斯特[医]重释[医]强制转换新创建具有动态存储持续时间的对象,删除删除以前由新表达式创建的对象,并释放获得的内存区域大小查询类型的大小...查询参数Pack%28的大小,因为C++11%29 Tyid查询类型no的类型信息,除了检查。表达式可以抛出异常%28,因为C++11%29查询对齐要求类型为%28,因为C++11%29。
C操作符优先文档
*。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。