C++ Operator Precedence
The operators at the top of this list are evaluated first.
| Precedence |
Operator |
Description |
Example |
Associativity |
| 1 |
::
| Scoping operator
| Class::age = 2;
| none |
| 2 |
() [] -> . ++ -- |
Grouping operator Array access Member
access from a pointer Member access from an
object Post-increment Post-decrement |
(a + b) / 4; array[4] = 2; ptr->age
= 34; obj.age = 34; for( i = 0; i < 10; i++ ) ... for( i
= 10; i > 0; i-- ) ... |
left to right |
| 3 |
! ~ ++ -- - + * & (type) sizeof |
Logical negation Bitwise
complement Pre-increment Pre-decrement Unary minus Unary
plus Dereference Address of Cast to a given type Return
size in bytes |
if( !done ) ... flags = ~flags; for( i
= 0; i < 10; ++i ) ... for( i = 10; i > 0; --i ) ... int
i = -1; int i = +1; data = *ptr; address = &obj; int
i = (int) floatNum; int size = sizeof(floatNum); |
right to left |
| 4 |
->* .* |
Member pointer selector Member object
selector |
ptr->*var = 24; obj.*var = 24; |
left to right |
| 5 |
* / % |
Multiplication Division Modulus |
int i = 2 * 4; float f = 10 / 3; int
rem = 4 % 3; |
left to right |
| 6 |
+ - |
Addition Subtraction |
int i = 2 + 3; int i = 5 - 1; |
left to right |
| 7 |
<< >> |
Bitwise shift left Bitwise shift right |
int flags = 33 << 1; int flags = 33
>> 1; |
left to right |
| 8 |
< <= > >= |
Comparison less-than Comparison
less-than-or-equal-to Comparison greater-than Comparison
geater-than-or-equal-to |
if( i < 42 ) ... if( i <= 42 )
... if( i > 42 ) ... if( i >= 42 ) ... |
left to right |
| 9 |
== != |
Comparison equal-to Comparison
not-equal-to |
if( i == 42 ) ... if( i != 42 ) ... |
left to right |
| 10 |
& |
Bitwise AND |
flags = flags & 42; |
left to right |
| 11 |
^ |
Bitwise exclusive OR |
flags = flags ^ 42; |
left to right |
| 12 |
| |
Bitwise inclusive (normal) OR |
flags = flags | 42; |
left to right |
| 13 |
&& |
Logical AND |
if( conditionA && conditionB )
... |
left to right |
| 14 |
|| |
Logical OR |
if( conditionA || conditionB ) ... |
left to right |
| 15 |
? : |
Ternary conditional (if-then-else) |
int i = (a > b) ? a : b; |
right to left |
| 16 |
= += -= *= /= %= &= ^= |= <<= >>= |
Assignment operator Increment and
assign Decrement and assign Multiply and assign Divide and
assign Modulo and assign Bitwise AND and assign Bitwise
exclusive OR and assign Bitwise inclusive (normal) OR and
assign Bitwise shift left and assign Bitwise shift right and
assign |
int a = b; a += 3; b -= 4; a *=
5; a /= 2; a %= 3; flags &= new_flags; flags ^=
new_flags; flags |= new_flags; flags <<= 2; flags
>>= 2; |
right to left |
| 17 |
, |
Sequential evaluation operator |
for( i = 0, j = 0; i < 10; i++, j++ )
... |
left to right |
One important aspect of C++ that is related to operator precedence is
the order of evaluation and the order of side
effects in expressions. In some circumstances, the order in which
things happen is not defined. For example, consider the following
code:
float x = 1;
x = x / ++x;
The value of x is not guaranteed to be consistent across
different compilers, because it is not clear whether the computer should
evaluate the left or the right side of the division first. Depending on
which side is evaluated first, x could take a different
value.
Furthermore, while ++x evaluates to x+1, the
side effect of actually storing that new value in x could happen
at different times, resulting in different values for x.
The bottom line is that expressions like the one above are horribly
ambiguous and should be avoided at all costs. When in doubt, break a
single ambiguous expression into multiple expressions to ensure that the
order of evaluation is correct.