4.4    Inkrement- und Dekrementoperator

Bei einem Inkrement (vom lateinischen Wort incrimere = erhöhen) wird der Wert einer Variablen um 1 erhöht, bei einem Dekrement (vom lateinischen Wort decrimere = erniedrigen) wird der Wert einer Variablen um 1 erniedrigt. Diese beiden Operatoren werden in C folgendermaßen geschrieben (siehe Tabelle 4.3).

Operator

Bedeutung

++

Inkrementoperator (Variable wird um 1 erhöht)

--

Dekrementoperator (Variable wird um 1 verringert)

Tabelle 4.3    Inkrement- und Dekrementoperator

Für die Verwendung dieser beiden Operatoren, die sich neben Ganzzahlen auch auf Fließkommazahlen anwenden lassen, gibt es jeweils zwei Möglichkeiten (siehe Tabelle 4.4).

Anwendung

Bedeutung

var++

Postfix-Schreibweise, erhöht den Wert von var, gibt aber noch den alten Wert an den aktuellen Ausdruck weiter.

++var

Präfix-Schreibweise, erhöht den Wert von var und gibt diesen sofort an den aktuellen Ausdruck weiter.

var--

Postfix-Schreibweise, reduziert den Wert von var, gibt aber noch den alten Wert an den aktuellen Ausdruck weiter.

--var

Präfix-Schreibweise, reduziert den Wert von var und gibt diesen sofort an den aktuellen Ausdruck weiter.

Tabelle 4.4    Postfix- und Präfix-Schreibweisen

Anwendungsgebiet von Inkrement- und Dekrementoperatoren

Hauptsächlich werden Inkrement- und Dekrementoperator bei Schleifen verwendet. Sie sind beide unärer Natur und können nur auf veränderbare Lvalues angewendet werden.

Das folgende Beispiel demonstriert Ihnen den Inkrementoperator (++) etwas genauer. Analog verhält sich natürlich auch der Dekrementoperator (--).

00  // Kapitel4/inkrement_dekrement.c
01 #include <stdio.h>

02 int main(void) {
03 int ival = 1;
04 printf("ival : %d\n", ival);
05 ival++;
06 printf("ival : %d\n", ival);
07 printf("ival : %d\n", ival++);
08 printf("ival : %d\n", ival);
09 printf("ival : %d\n", ++ival);
10 return 0;
11 }

Listing 4.4    Das Listing demonstriert den Umgang mit den Inkrement- und Dekrementoperatoren.

Das Programm gibt bei der Ausführung Folgendes aus:

ival : 1
ival : 2
ival : 2
ival : 3
ival : 4

Bei der ersten Verwendung des Inkrementoperators in Zeile (05) wird der alte Wert noch an den aktuellen Ausdruck weitergegeben. Da hier die Inkrementierung für sich alleine steht, ist dies gleichzeitig auch der aktuelle Ausdruck. Zeile (06) hingegen ist der nächste Ausdruck, weshalb hier der Wert von ival 2 lautet. Sie werden das besser verstehen, wenn Sie sich Zeile (07) ansehen. Hier lautet die Ausgabe nach wie vor 2, weil die Inkrementierung innerhalb des aktuellen Ausdrucks ausgeführt wird, und dieser endet am Semikolon, wo sich dann auch das späte Inkrement auswirkt. Daher hat erst der nächste Ausdruck in Zeile (08) den erwarteten Wert 3. Wollen Sie den Wert einer Variablen sofort innerhalb eines Ausdrucks inkrementieren, müssen Sie statt der Postfix- die Präfix-Schreibweise verwenden, die Sie in Zeile (09) sehen.

Nebeneffekte und Sequenzpunkte

An dieser Stelle soll anhand des Inkrementoperators ++ noch kurz auf die Begriffe Nebeneffekt und Sequenzpunkt eingegangen werden. Ein Nebeneffekt (oder auch Seiteneffekt bzw. engl. side effect) tritt auf, wenn der Lvalue nicht nur ausgewertet, sondern gleichzeitig auch verändert wird. Das folgende Beispiel zeigt, in welchem Zusammenhang die sogenannten Nebeneffekte stehen:

01  int iVar = 5;
02 int aVar = iVar + iVar++;

In diesem Beispiel wird an aVar der Rückgabewert der Berechnung zugewiesen. Je nachdem, wann der Nebeneffekt ausgewertet wird (ob iVar noch 5 oder 6 ist), gibt diese Addition 10 oder 11 zurück. Mit einem Sequenzpunkt (engl. sequence point) wird der Punkt festgelegt, bis zu dem der Nebeneffekt ausgewertet sein muss. Im Beispiel befindet sich der Sequenzpunkt beim Auftreten des Semikolons am Ende der Anweisung der Zeile (02). Somit ist jedes Auftreten eines Semikolons ein Sequenzpunkt. Nach dem Sequenzpunkt besitzt die Variable iVar auf jeden Fall den Wert 6.

Zum Schluss stellen Sie sich vielleicht die Frage, warum man denn für i=i+1 und i=i-1 extra Operatoren benötigt. Muss man wirklich inzwischen an jeder popligen Stelle Zeit sparen, und kann man sich nicht einmal ein paar Zeichen mehr erlauben, als nötig sind? Die Antwort ist, dass fast jeder Prozessor extra Befehle für Inkrement und Dekrement besitzt, und dass diese zehnmal schneller arbeiten, als z. B. das Pendant i=i+1. Deshalb werden diese Operatoren auch vor allem bei (Kopier)schleifen eingesetzt.