Operator precedence and associativity
Operator precedence defines the order in which operators are evaluated in expressions with multiple operators.
Operators with higher precedence will be bound tighter (as if by parentheses) to its argument than the operators with lower precedence. For example, the expression a + b * c is equivalent to a + (b * c). That is, we firstly evaluate the multiplication operator and only then sum the result of the multiplication and the value of a
. This is because the multiplication operator has higher precedence.
If there are multiple operators of the same precedence in the expression, the order of evaluation is defined by their associativity: either right-to-left or left-to-right. For example, a + b - c is equivalent to (a + b) - c as associativity of these particular operators is left to right.
The following table lists the precedence and associativity of C++ operators.
Operators are listed top to bottom, in descending precedence. in an
Precedence | Operator | Description | Associativity |
---|---|---|---|
1 | ::
|
Scope resolution | Left-to-right |
2 | ++ --
|
Suffix/postfix increment and decrement | |
()
|
Function call | ||
[]
|
Array subscripting | ||
.
|
Element selection by reference | ||
->
|
Element selection through pointer | ||
3 | ++ --
|
Prefix increment and decrement | Right-to-left |
+ −
|
Unary plus and minus | ||
! ~
|
Logical NOT and bitwise NOT | ||
(type)
|
Type cast | ||
*
|
Indirection (dereference) | ||
&
|
Address-of | ||
sizeof
|
Size-of | ||
new , new[]
|
Dynamic memory allocation | ||
delete , delete[]
|
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 | ||
16 | throw
|
Throw operator (for exceptions) | |
17 | ,
|
Comma | Left-to-right |