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 before using it. The bottom line is that you should not use the
same variable multiple times in a single expression when using operators
with side effects.
All operators on the same line have the same precedence. The first line has the highest precedence.
| () | [] | -> | . | |||||||
| ! | ~ | ++ | -- | + | - | * | & | sizeof | ||
| * | / | % | ||||||||
| + | - | |||||||||
| << | >> | |||||||||
| < | <= | >= | > | |||||||
| == | != | |||||||||
| & | ||||||||||
| ^ | ||||||||||
| | | ||||||||||
| && | ||||||||||
| || | ||||||||||
| ?: | ||||||||||
| = | += | -= | *= | /= | %= | &= | ^= | |= | <<= | >>= |
| , |
Lary Huang has told me that the postfix unary -- and postfix unary ++ have a higher precedence than the prefix unary -- and prefix unary ++.
All operators in the same 'block' have the same precedence. The first block has the highest precedence.
| Group | Operator | Description | Example |
|---|---|---|---|
| Membership. | |||
| () | Function call /Grouping |
count = function(4,3); (a + b) / 4; |
|
| [] | Array | value = array[5] + increment; | |
| -> | Structure pointer | ptr->age = 34; | |
| . | Structure member | obj.age = 34; | |
| :: | Scoping | Class::age = 2; | |
| ++ | Post - Increment | for( i = 0; i < 10; i++ ) ... | |
| Post - Decrement | for( i = 10; i > 0; i-- ) ... | ||
| Unary. | |||
| ! | Logical NOT | if( !done ) ... | |
| ~ | Bitwise complement | flags = ~flags; | |
| ++ | Pre-Increment | for( i = 0; i < 10; ++i ) ... | |
| -- | Pre-Decrement | for( i = 10; i > 0; --i ) ... | |
| + | Unary plus | int i = +1; | |
| - | Unary Minus | int i = -1; | |
| * | Dereference, Pointer to data | data = *ptr; | |
| & | Address of a variable | address = &obj; | |
| sizeof | size in bytes | int size = sizeof(floatNum); | |
| (type) | type cast | int i = (int) floatNum; | |
| selector | |||
| ->* | Member pointer selector | ptr->*var = 24; | |
| .* | Member pointer selector | obj.*var = 24; | |
| Binary. | |||
| * | Multiply. | int i = 2 * 4; | |
| / | Divide. | float f = 10 / 3; | |
| % | Modulo. | int rem = 4 % 3; | |
| Binary term | |||
| + | Addition | int i = 2 + 3; | |
| - | Subtraction. | int i = 5 - 1; | |
| Bitwise Shift | |||
| << | Bitwise shift left. | int flags = 33 << 1; | |
| >> | Bitwise shift Right. | int flags = 33 >> 1; | |
| Relational. | |||
| < | Less than. | if( i < 42 ) ... | |
| > | Greater than. | if( i > 42 ) ... | |
| <= | Less than or equal too. | if( i <= 42 ) ... | |
| >= | Greater than or equal too. | if( i >= 42 ) ... | |
| Equality | |||
| == | Equal too. | if( i == 42 ) ... | |
| != | Not equal too. | if( i != 42 ) ... | |
| Bitwise AND | |||
| & | bitwise AND | flags = flags & 42; | |
| Bitwise XOR | |||
| ^ | bitwise Excusive OR | flags = flags ^ 42; | |
| Bitwise OR | |||
| | | bitwise OR | flags = flags | 42; | |
| Logical. | |||
| && | Logical AND | if( conditionA && conditionB ) ... | |
| Logical. | |||
| || | Logical OR | if( conditionA || conditionB ) ... | |
| Conditional | |||
| ? : | Conditional construct. | int i = (a > b) ? a : b; | |
| Assignment | |||
| = | Equals | int a = b; | |
| += | assignment | a += 3; | |
| -= | assignment | b -= 4; | |
| *= | assignment | a *= 5; | |
| /= | assignment | a /= 2; | |
| %= | assignment | a %= 3; | |
| &= | assignment | flags &= new_flags; | |
| ^= | assignment | flags ^= new_flags; | |
| |= | assignment | flags ^= new_flags; | |
| <<= | assignment | flags <<= 2; | |
| >>= | assignment | flags >>= 2; | |
| Series | |||
| , | Comma | for( i = 0, j = 0; i < 10; i++, j++ ) ... |
Expressions and operators.
Assignment Operators.
| Top | Master Index | Keywords | Functions |