C++ Operator Precedence


The following table lists the precedence and associativity of C++ operators. Operators are listed top to bottom, in descending precedence.

Precedence Operator Description Associativity

1 :: Scope resolution Left-to-right

2 ++ -- Suffix/postfix increment and decrement Left-to-right
() 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 Left-to-right

6 + Addition and subtraction Left-to-right

7 << >> Bitwise left shift and right shift Left-to-right

8 < <= For relational operators < and ≤ respectively Left-to-right
> >= For relational operators > and ≥ respectively

9 == != For relational = and ≠ respectively Left-to-right

10 & Bitwise AND Left-to-right

11 ^ Bitwise XOR (exclusive or) Left-to-right

12 | Bitwise OR (inclusive or) Left-to-right

13 && Logical AND Left-to-right

14 || Logical OR Left-to-right

15 ?: Ternary conditional Right-to-Left

16 = Direct assignment (provided by default for C++ classes) Right-to-Left
+= −= 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

17 throw Throw operator (exceptions throwing) Right-to-Left

18 , Comma Left-to-right

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.

An operator's precedence is unaffected by overloading.

[edit] Notes

The standard itself doesn't specify precedence levels. They are derived from the grammar.

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/language/operator_precedence&oldid=31257"