C++ Operator Precedence
The operators at the top of this list are evaluated first.
Precedence |
Operator |
Description |
Example |
Associativity |
1 |
() [] -> . :: ++ -- |
Grouping operator Array access Member
access from a pointer Member access from an object Scoping
operator Post-increment Post-decrement |
(a + b) / 4; array[4] = 2; ptr->age
= 34; obj.age = 34; Class::age = 2; for( i = 0; i < 10;
i++ ) ... for( i = 10; i > 0; i-- ) ... |
left to right |
2 |
! ~ ++ -- - + * & (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 |
3 |
->* .* |
Member pointer selector Member pointer
selector |
ptr->*var = 24; obj.*var = 24; |
left to right |
4 |
* / % |
Multiplication Division Modulus |
int i = 2 * 4; float f = 10 / 3; int
rem = 4 % 3; |
left to right |
5 |
+ - |
Addition Subtraction |
int i = 2 + 3; int i = 5 - 1; |
left to right |
6 |
<< >> |
Bitwise shift left Bitwise shift right |
int flags = 33 << 1; int flags = 33
>> 1; |
left to right |
7 |
< <= > >= |
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 |
8 |
== != |
Comparison equal-to Comparison
not-equal-to |
if( i == 42 ) ... if( i != 42 ) ... |
left to right |
9 |
& |
Bitwise AND |
flags = flags & 42; |
left to right |
10 |
^ |
Bitwise exclusive OR |
flags = flags ^ 42; |
left to right |
11 |
| |
Bitwise inclusive (normal) OR |
flags = flags | 42; |
left to right |
12 |
&& |
Logical AND |
if( conditionA && conditionB )
... |
left to right |
13 |
|| |
Logical OR |
if( conditionA || conditionB ) ... |
left to right |
14 |
? : |
Ternary conditional (if-then-else) |
int i = (a > b) ? a : b; |
right to left |
15 |
= += -= *= /= %= &= ^= |= <<= >>= |
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 |
16 |
, |
Sequential evaluation operator |
for( i = 0, j = 0; i < 10; i++, j++ )
... |
left to right |
It is important to note that there is no specified
precedence for the operation of changing a variable into a value.
For example, consider the following code:
float x, result;
x = 1;
result = x / ++x;
The value of result is not guaranteed to be consistent across
different compilers, because it is not clear whether the computer should
change the variable x (the one that occurs on the left side of
the division operator) before using it. Depending on which compiler you
are using, the variable result can either be 1.0
or 0.5. The bottom line is that you should not
use the same variable multiple times in a single expression when using
operators with side effects.