4.2. Rechnen in C: Arithmetische Operatoren

Die Programmiersprache C verfügt über die gängigen arithmetischen Operatoren: Addition (+), Subtraktion (-), Multiplikation (*) und Division (/). Darüber hinaus existiert ein Operator für die Modulo-Division, die den Rest einer ganzzahligen Division berechnet. Dieser wird dargestellt durch das Prozentzeichen (%). Für die Modulo-Division müssen beide Operanden vom Typ integer sein. Alle diese Operatoren liegen als binäre Operatoren vor, d.h., sie benötigen zwei Operanden, auf die sie angewendet werden. Beispiele:


iHeight / 2
2 * fRadius * dPi
lTextLen - iTextPos
4 + 4
23 % 5        /* Hat 3 zum Ergebnis */
543.3 % 4     /* Fehler, da Dividend nicht ganzzahlig */
lPfennige / 100
lPfennige % 100

Im vorletzten Beispiel wird der aktuelle Wert der Variablen lPfennige durch 100 dividiert, beispielsweise um einen Pfennig-Betrag in DM umzurechnen. Der Divisionsrest wird dabei nicht berücksichtigt. Dieser könnte mit Hilfe der darauf folgenden Modulo-Division errechnet werden, um festzustellen, wieviele Pfennige nach der Umrechnung in DM übrigbleiben.

Die Operatoren "+" und "-" sind zusätzlich als unäre Operatoren verfügbar und dienen dazu, einen einzelnen Operanden mit einem positiven oder negativen Vorzeichen zu versehen. Beispiel:


.
.
{
int iSize = 120;
int iLen;

 iLen = -iSize;
/* Der Wert von iLen beläuft sich nun auf -120 */
.
.
}

Der Variablen iLen wird in diesem Beispiel der negative Wert von iSize zugewiesen, das heißt, iLen enthält nach der Zuweisung den Wert -120. Die Verwendung des unären "+"-Operators ist eher ungewöhnlich, da ja das Fehlen eines Vorzeichens gleichbedeutend mit der Verwendung von "+" ist.

Wie allgemein bei der Auswertung von arithmetischen Ausdrücken üblich, berücksichtigt auch C den Vorrang der Operatoren. Die Priorität der beteiligten Operatoren bestimmt die Reihenfolge, in der ein arithmethischer Ausdruck ausgewertet wird. Unäres "-" und "+" haben die höchste Priorität, während Addition und Subtraktion den geringsten Vorrang besitzen. Dazwischen liegen mit gleicher Priorität Multiplikation, Division und Modulo-Division.

Folgende Aufstellung gibt die arithmetischen Operatoren geordnet nach absteigendem Vorrang wider:

Operator Beschreibung Assoziativität
+ Unäres Plus Von rechts nach links
- Unäres Minus
* Multiplikation Von links nach rechts
/ Division
% Modulo
+ Addition Von links nach rechts
- Subtraktion

Enthält ein Ausdruck eine Kombination aus diesen Operatoren, dann folgt aus deren unterschiedlicher Priorität, daß zuerst alle unären Plus und Minus berücksichtigt werden und dann Multiplikationen, Divisionen und Modulo-Divisionen. Erst zum Schluß werden Additionen und Subtraktionen ausgeführt.

Beinhaltet ein Ausdruck mehrere Operatoren gleichen Vorrangs, dann erfolgt die Auswertung unter Berücksichtigung ihrer Assoziativität. Folgt z.B. auf eine Addition eine Subtraktion, dann wird letztere erst nach der Addition ausgeführt, weil beide von links nach rechts assoziativ sind.

Der Ausdruck ans = 5 + 2 * 4 / 2 % 3 + 10 - 3 würde z.B. folgendermaßen ausgewertet:

Vorhandene Multiplikation, Division und Modulo-Division genießen gleiche Priorität, daher entscheidet die Assoziativität (von links nach rechts). Beginn also mit der äußerst linken Multiplikation: 1. Schritt: ans = 5 + 2 * 4 / 2 % 3 + 10 - 3 2 * 4 = 8 Dann äußerst linke Division: 2. Schritt: ans = 5 + 8 / 2 % 3 + 10 - 3 8 / 2 = 4 Modulo-Division vor Addition und Subtraktion: 3. Schritt: ans = 5 + 4 % 3 + 10 - 3 4 % 3 = 1 Verbleibende Additionen und Subtraktion haben gleichen Vorrang, daher bestimmt die links-nach-rechts-Assoziativität die verbleibende Auswertung: 4. Schritt: ans = 5 + 1 + 10 - 3 5 + 1 = 6 5. Schritt: ans = 6 + 10 - 3 6 + 10 = 16 6. Schritt: ans = 16 - 3

Die Auswertungsreihenfolge, die auf der Priorität der Operatoren beruht, kann durch die Verwendung von Klammern gesteuert werden. Die runden Klammern sind Operatoren, die den Vorrang von Operationen erhöhen. Operationen innerhalb von Klammern besitzen die höchste Priorität.


lResult = ( 4 + 12 ) * 2

In diesem Beispiel erhält die Variable den Wert 32; obwohl die Addition den geringeren Vorrang aufweist als die Multiplikation, wird sie wegen der Klammern zuerst ausgeführt.