Die arithmetischen Operatoren sind +, -, *, /
und %
.
Der Operator %
(modulo) bildet den Rest der ganzzahligen
Division des linken mit dem rechten Operanden (beide ganzzahlig).
Wenn beide positiv sind,
ist das Ergebnis positiv und echt kleiner als der rechte Operand.
Für einen oder zwei negative Operanden ist das Vorzeichen des
Ergebnisses implementierungsabhängig. Die Kombination mit einem
Gleichheitszeichen (Zuweisungsoperator)
erspart die Wiederholung des linken Operanden:
int i=3, j=7; // initialize i = 3 + j % i; // i = 3 + (j mod i), i is set to 4 i += 3 * 4 + j; // i = i + (3 * 4 + j), i is set to 23 i /= 5; // integer division, i is now 4 i /= 5; // integer division, i is now 0 !
Der Typ eines Operatorausdrucks hängt von den Typen der Argumente
ab. Wenn beide Operanden vom Typ T
sind, so ist auch das
Resultat wieder vom Typ T
. Bei verschiedenen
Typen entscheidet der ``bessere'' Typ (sagen wir U
),
und es wird der T
Operand erst in U
gewandelt,
bevor die Operation durchgeführt wird. Das Ergebnis des Ausdrucks
ist dann vom Typ U
. C/C++ führt folgende ``type promotions''
durch:
bool -> char -> short -> int -> long -> float -> double -> long double signed -> unsigned (!)Insbesondere die Verwandlung von vorzeichenbehafteten Größen nach rein positiven führt häufig zu unliebsamen Überraschungen. Der Ausdruck
3U - 5
wird in 3U - 5U
gewandelt und ergibt
ein implementierungsabhängiges Resultat, denn das Ergebnis der
Subtraktion kann nicht in einer unsigned int
Variablen
gespeichert werden.
Diese Regeln der automatischen Typ-Umwandlung gelten sinngemäß
auch für die weiteren Operatoren.
Die unären Operatoren ++
und --
gibt es in postfix und
prefix-Form, und sie bewirken, daß der Operand um Eins
inkrementiert, bzw. dekrementiert wird. In der postfix-Form ist der
Wert der Operation der des Operanden vor der In/Dekrementierung,
in der prefix-Form der Wert nach der Operation.
int i=5, j; j = i++; // j is 5 now (i before increment, i is incremented to 6 double a[20]; i=j; // i=j=5 std::cout << a[++j] << a[j++]; // prints a[6] twice, j is now 7 std::cout << a[i++] << a[++i]; // prints a[5] and a[7], i is now 7 // j++ = i; // ERROR: cannot assign to a temporary // i = (j++)++; // ERROR: cannot apply ++ to a temporary