1.6 Operators
Operators specify an evaluation to be performed on one of the following:
One operand (unary operator)
Two operands (binary operator)
Three operands (ternary operator)
The C++ language includes all C operators and adds several new operators. The following syntax lists those operators unique to C++ first, and it then lists the operators shared between C and C++.
Syntax
operator: one of
| C++ Operators |
.* |
: : |
delete |
| |
>* |
new, |
|
| C/C++ Operators |
[ |
% |
*= |
| |
] |
<< |
/= |
| |
( |
>> |
%= |
| |
) |
< |
+= |
| |
. |
> |
= |
| |
> |
<= |
<<= |
| |
++ |
>= |
>>= |
| |
|
== |
&= |
| |
& |
!= |
^= |
| |
* |
|
|= |
| |
+ |
| |
' |
| |
|
&& |
# |
| |
~ |
|| |
## |
| |
! |
? |
:> (Microsoft C and C++ specific) |
| |
sizeof |
:, |
|
| |
/ |
=, |
|
Operators follow a strict precedence. This precedence defines the evaluation order of expressions containing these operators. Operators associate with either the expression on their left or the expression on their right; this is called associativity. Table 1.2 shows the precedence and associativity of C++ operators (from highest to lowest precedence).
Table 1.2 C++ Operator PrecedenceSyntax, and Associativity
Operator
|
Name or Meaning
|
Syntax
|
Associativity |
| |
|
|
|
| == |
Equality |
equality-expression == relational-expression |
Left to right |
| |
|
, |
|
| :: |
Scope resolution |
class-name :: name, None |
|
| :: |
Global |
:: name |
None |
| [ ] |
Array subscript |
postfix-expression [ expressionopt ] |
Left to right |
| ( ) |
Function call |
postfix-expression ( expression-listopt ) |
Left to right |
| ( ) |
Conversion |
simple-type-name ( expression-listopt ) |
None |
| . |
Member selection (object) |
postfix-expression . name |
Left to right |
| > |
Member selection (pointer) |
postfix-expression > name |
Left to right |
| ++ |
Postfix increment |
postfix-expression ++ |
None |
| |
Postfix decrement |
postfix-expression , None |
|
| new |
Allocate object |
::opt new placementopt new-type-name new-initializeropt |
None |
| |
|
::opt new placementopt ( type-name ) new-initializeropt |
None |
| delete |
Deallocate object |
::opt delete cast-expression, None |
|
| delete[ ] |
|
::opt delete [ ] cast-expression, None |
|
| ++ |
Prefix increment |
++ unary-expression |
None |
| |
Prefix decrement |
unary-expression, None |
|
| * |
Dereference |
* cast-expression |
None |
| & |
Address-of |
& cast-expression |
None |
| + |
Unary plus |
+ cast-expression |
None |
| |
Arithmetic negation (unary) |
cast-expression, None |
|
Table 1.2 (continued)
Operator
|
Name or Meaning
|
Syntax
|
Associativity |
| |
|
|
|
| ! |
Logical NOT |
! cast-expression |
None |
| ~ |
Bitwise complement |
~ cast-expression |
None |
| :> |
Base operator |
base-expression :> expression, None |
|
| sizeof |
Size of object |
sizeof unary-expression, None |
|
| sizeof ( ) |
Size of type |
sizeof( type-name ), None |
|
| (type) |
Type cast (conversion) |
( type-name ) cast-expression |
Right to left |
| .* |
Apply pointer to class member (objects) |
pm-expression .* cast-expression |
Left to right |
| >* |
Dereference pointer to class member |
pm-expression >* cast-expression |
Left to right |
| * |
Multiplication |
multiplicative-expression * pm-expression |
Left to right |
| / |
Division |
multiplicative-expression / pm-expression |
Left to right |
| % |
Remainder (modulus) |
multiplicative-expression % pm-expression |
Left to right |
| + |
Addition |
additive-expression + multiplicative-expression |
Left to right |
| |
Subtraction |
additive-expression multiplicative-expression |
Left to right |
| << |
Left shift |
shift-expression << additive-expression |
Left to right |
| >> |
Right shift |
shift-expression >> additive-expression |
Left to right |
| < |
Less than |
relational-expression < shift-expression |
Left to right |
| > |
Greater than |
relational-expression > shift-expression |
Left to right |
Table 1.2 (continued)
Operator
|
Name or Meaning
|
Syntax
|
Associativity |
| |
|
|
|
| <= |
Less than or equal to |
relational-expression <= shift-expression |
Left to right |
| >= |
Greater than or equal to |
relational-expression >= shift-expression |
Left to right |
| != |
Inequality |
equality-expression != relational-expression |
Left to right |
| & |
Bitwise AND |
and-expression & equality-expression |
Left to right |
| ^ |
Bitwise exclusive OR |
exclusive-or-expression ^ and-expression |
Left to right |
| | |
Bitwise OR |
inclusive-or-expression | exclusive-or-expression |
Left to right |
| && |
Logical AND |
logical-and-expression && inclusive-or-expression |
Left to right |
| || |
Logical OR |
logical-or-expression || logical-and-expression |
Left to right |
| e1?e2:e3 |
Conditional |
logical-or-expression ? expression : conditional-expression |
Right to left |
| = |
Assignment |
unary-expression = assignment-expression |
Right to left |
| *= |
Multiplication assignment |
unary-expression *= assignment-expression |
Right to left |
| /= |
Division assignment |
unary-expression /= assignment-expression |
Right to left |
| %= |
Modulus assignment |
unary-expression %= assignment-expression |
Right to left |
| += |
Addition assignment |
unary-expression += assignment-expression |
Right to left |
| = |
Subtraction assignment |
unary-expression = assignment-expression |
Right to left |
| <<= |
Left-shift assignment |
unary-expression <<= assignment-expression |
Right to left |
Table 1.2 (continued)
Operator
|
Name or Meaning
|
Syntax
|
Associativity |
| |
|
|
|
| >>= |
Right-shift assignment |
unary-expression >>= assignment-expression |
Right to left |
| &= |
Bitwise AND assignment |
unary-expression &= assignment-expression |
Right to left |
| |= |
Bitwise inclusive OR assignment |
unary-expression |= assignment-expression |
Right to left |
| ^= |
Bitwise exclusive OR assignment |
unary-expression ^= assignment-expression |
Right to left |
| , |
Comma |
expression, assignment-expression |
Left to right |
The [ ], ( ), and ? : operators (array subscript, function call, and conditional, respectively) can be used only as pairs. However, these operators can be separated by expressions (see Chapter 4, Expressions, for more information).
The # and ## operators can occur only in #define preprocessor directives.