General topics | ||||||||||||||||
Flow control | ||||||||||||||||
Conditional execution statements | ||||||||||||||||
Iteration statements (loops) | ||||||||||||||||
Jump statements | ||||||||||||||||
Functions | ||||||||||||||||
Function declaration | ||||||||||||||||
Lambda function expression | ||||||||||||||||
inline specifier | ||||||||||||||||
Dynamic exception specifications(until C++17*) | ||||||||||||||||
noexcept specifier(C++11) | ||||||||||||||||
Exceptions | ||||||||||||||||
Namespaces | ||||||||||||||||
Types | ||||||||||||||||
Specifiers | ||||||||||||||||
| ||||||||||||||||
Storage duration specifiers | ||||||||||||||||
Initialization | ||||||||||||||||
Expressions | ||||||||||||||||
| ||||||||||||||||
Alternative representations | ||||||||||||||||
Literals | ||||||||||||||||
Boolean -Integer -Floating-point | ||||||||||||||||
Character -String -nullptr(C++11) | ||||||||||||||||
User-defined(C++11) | ||||||||||||||||
Utilities | ||||||||||||||||
Attributes(C++11) | ||||||||||||||||
Types | ||||||||||||||||
typedef declaration | ||||||||||||||||
Type alias declaration(C++11) | ||||||||||||||||
Casts | ||||||||||||||||
Memory allocation | ||||||||||||||||
Classes | ||||||||||||||||
Class-specific function properties | ||||||||||||||||
| ||||||||||||||||
Special member functions | ||||||||||||||||
Templates | ||||||||||||||||
Miscellaneous | ||||||||||||||||
General | |||||||||||||||||||||||||||||||||||||||||||||||||||
Literals | |||||||||||||||||||||||||||||||||||||||||||||||||||
Operators | |||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||
Conversions | |||||||||||||||||||||||||||||||||||||||||||||||||||
The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.a,b andc are operands.
Precedence | Operator | Description | Associativity |
---|---|---|---|
1 | a::b | Scope resolution | Left-to-right → |
2 | a++ a-- | Suffix/postfixincrement and decrement | |
type (a) type {a} | Functional cast | ||
a() | Function call | ||
a[] | Subscript | ||
a.b a->b | Member access | ||
3 | ++a --a | Prefixincrement and decrement | Right-to-left ← |
+a -a | Unaryplus and minus | ||
!a ~a | Logical NOT andbitwise NOT | ||
(type )a | C-style cast | ||
*a | Indirection (dereference) | ||
&a | Address-of | ||
sizeof | Size-of[note 1] | ||
co_await | await-expression(C++20) | ||
new – new[] | Dynamic memory allocation | ||
delete – delete[] | Dynamic memory deallocation | ||
4 | a.*b a->*b | 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 | a<< b a>> b | Bitwiseleft shift and right shift | |
8 | a<=> b | Three-way comparison operator(since C++20) | |
9 | a< b a<= b a> b a>= b | Forrelational operators< and<= and> and>= respectively | |
10 | a== b a!= b | Forequality operators= and!= respectively | |
11 | a& b | Bitwise AND | |
12 | a^ b | Bitwise XOR (exclusive or) | |
13 | a| b | Bitwise OR (inclusive or) | |
14 | a&& b | Logical AND | |
15 | a|| b | Logical OR | |
16 | a? b: c | Ternary conditional[note 2] | Right-to-left ← |
throw | throw operator | ||
co_yield | yield-expression(C++20) | ||
a= b | Direct assignment (provided by default for C++ classes) | ||
a+= b a-= b | Compound assignment by sum and difference | ||
a*= b a/= b a%= b | Compound assignment by product, quotient, and remainder | ||
a<<= b a>>= b | Compound assignment by bitwise left shift and right shift | ||
a&= b a^= b a|= b | Compound assignment by bitwise AND, XOR, and OR | ||
17 | a, b | Comma | Left-to-right → |
?
and:
) is parsed as if parenthesized: its precedence relative to?:
is ignored.When parsing an expression, an operator which is listed on some row of the table above with a precedence will be bound tighter (as if by parentheses) to its arguments than any operator that is listed on a row further below it with a lower precedence. For example, the expressionsstd::cout<< a& b and*p++ are parsed as(std::cout<< a)& b and*(p++), and not asstd::cout<<(a& b) or(*p)++.
Operators that have the same precedence are bound to their arguments in the direction of their associativity. For example, the expressiona= b= c is parsed asa=(b= c), and not as(a= b)= c because of right-to-left associativity of assignment, buta+ b- c is parsed(a+ b)- c and nota+(b- c) because of left-to-right associativity of addition and subtraction.
Associativity specification is redundant for unary operators and is only shown for completeness: unary prefix operators always associate right-to-left (delete++*p isdelete(++(*p))) and unary postfix operators always associate left-to-right (a[1][2]++ is((a[1])[2])++). Note that the associativity is meaningful for member access operators, even though they are grouped with unary postfix operators:a.b++ is parsed(a.b)++ and nota.(b++).
Operator precedence is unaffected byoperator overloading. For example,std::cout<< a? b: c; parses as(std::cout<< a)? b: c; because the precedence of arithmetic left shift is higher than the conditional operator.
Precedence and associativity are compile-time concepts and are independent fromorder of evaluation, which is a runtime concept.
The standard itself doesn't specify precedence levels. They are derived from the grammar.
const_cast
,static_cast
,dynamic_cast
,reinterpret_cast
,typeid
,sizeof...
,noexcept
andalignof
are not included since they are never ambiguous.
Some of the operators havealternate spellings (e.g.,and for&&,or for||,not for!, etc.).
In C, the ternary conditional operator has higher precedence than assignment operators. Therefore, the expressione= a< d? a++: a= d, which is parsed in C++ ase=((a< d)?(a++):(a= d)), will fail to compile in C due to grammatical or semantic constraints in C. See the corresponding C page for details.
Common operators | ||||||
---|---|---|---|---|---|---|
assignment | increment decrement | arithmetic | logical | comparison | member access | other |
a= b | ++a | +a | !a | a== b | a[...] | function call a(...) |
comma a, b | ||||||
conditional a? b: c | ||||||
Special operators | ||||||
static_cast converts one type to another related type |
C documentation forC operator precedence |