| 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 |