next up previous contents
Next: Vergleichs- und logische Operatoren Up: Operatoren Previous: Operatoren

Arithmetische Operatoren

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


next up previous contents
Next: Vergleichs- und logische Operatoren Up: Operatoren Previous: Operatoren
© R.Hilfer et al., ICA-1, Univ. Stuttgart
28.6.2002