C++ Operator Precedence
The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.
||Suffix/postfix increment and decrement|
||Function-style type cast|
||Element selection by reference|
||Element selection through pointer|
||Prefix increment and decrement||Right-to-left|
||Unary plus and minus|
||Logical NOT and bitwise NOT|
||C-style type cast|
||Dynamic memory allocation|
||Dynamic memory deallocation|
||Pointer to member||Left-to-right|
||Multiplication, division, and remainder|
||Addition and subtraction|
||Bitwise left shift and right shift|
||For relational operators < and ≤ respectively|
||For relational operators > and ≥ respectively|
||For relational = and ≠ respectively|
||Bitwise XOR (exclusive or)|
||Bitwise OR (inclusive or)|
||Ternary conditional[note 2]||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|
||Throw operator (for exceptions)|
- The operand of
sizeofcan't be a C-style type cast: the expression
sizeof (int) * pis unambiguously interpreted as
(sizeof(int)) * p, but not
- The expression in the middle of the conditional operator (between
:) is parsed as if parenthesized: its precedence relative to
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 as std::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.
Operator precedence is unaffected by operator overloading.
Precedence and associativity are independent from order of evaluation.
The standard itself doesn't specify precedence levels. They are derived from the grammar.
Some of the operators have alternate spellings (e.g., and for
&&, or for
||, not for
Relative precedence of the conditional and assignment operators differs between C and C++: in C, assignment is not allowed on the right hand side of a conditional operator, so e = a < d ? a++ : a = d cannot be parsed. Many C compilers use a modified grammar where
?: has higher precedence than
=, which parses that as e = ( ((a < d) ? (a++) : a) = d ) (which then fails to compile because
?: is never lvalue in C and
= requires lvalue on the left). In C++,
= have equal precedence and group right-to-left, so that e = a < d ? a++ : a = d parses as e = ((a < d) ? (a++) : (a = d)).
 See also
a = b
a == b
static_cast converts one type to another compatible type
C documentation for C operator precedence