4.4. Der kleine Unterschied: Inkrement- und Dekrementoperator
Bei vielen Programmierproblemen ergibt sich die Notwendigkeit, daß der Wert einer Variablen um den Wert 1 erhöht oder vermindert werden muß. Für diese Aufgabe stehen uns bisher der binäre Plus- (Minus-) zusammen mit dem Zuweisungoperator zur Verfügung. Alternativ könnten die zusammengesetzten Operatoren "+"= bzw. "-"= verwendet werden. C bietet zusätzlich für diesen Zweck eigene Operatoren an, nämlich den unären Inkrement- und Dekrementoperator. Der Inkrementoperator wird geschrieben als "++", der dekrementielle Widerpart als "--". Um den Wert der Variablen lSumme um 1 zu erhöhen, kann anstatt
lSumme = lSumme + 1; oder lSumme += 1;
der Inkrementoperator eingesetzt werden:
lSumme++;
Da sowohl der Inkrement- wie der Dekrementoperator eine Zuweisung an den Operanden vornehmen - nämlich mit dem um 1 erhöhten ursprünglichen Wert - versteht es sich von selbst, daß beide nur auf Variablen und nicht auf Konstanten angewandt werden können.
.
.
{
const float fPi = 3.1415;
fPi--; /* falsch, da Wert von fPi konstant */
3L++; /* aus gleichem Grund Unsinn */
.
.
}
Beide Operatoren existieren in einer Präfix- und einer Postfixvariante (Suffixvariante). Beschränkt sich eine Anweisung nur darauf, den Wert einer Variablen zu erhöhen oder zu vermindern, dann ist die Entscheidung zwischen Präfix- und Postfixnotation reine Geschmacksache. Wird der Wert einer Variablen innerhalb eines Ausdrucks inkrementiert bzw. dekrementiert, dann drohen je nach Variante tückische Nebeneffekte. Bei der Präfixnotation wird zuerst der Wert der Variablen erhöht, und danach werden Zuweisungs-, arithmetische oder sonstige Operationen vorgenommen; bei der Suffixvariante verhält es sich gerade umgekehrt.
lSum += ++iCount;
Bei der Auswertung dieses Ausdrucks wird zuerst der Wert der Variablen iCount um 1 erhöht, dieser dann zum Wert der Variablen lSum hinzuaddiert und das Resultat schließlich der Variablen lSum zugewiesen.
.
.
{
int iTemp = 5, iCount = 3, iSum;
iSum = iTemp-- * iCount;
.
.
}
Welchen Wert erhält iSum? Da sich der Wert von iCount ja nicht verändert, hängt das Resultat von der Auswertung des Dekrementoperators ab. Der Wert von iTemp wird wohl um 1 vermindert, zur Multiplikation wird wegen der Postfixvariante von "-" noch der alte Wert herangezogen: iSum erhält also den Wert 15.
Nach Möglichkeit sollte also bei der Verwendung dieser Operatoren darauf geachtet werden, daß keine unerwünschten Nebeneffekte auftreten; dies geschieht am besten dadurch, indem man im Zweifelsfall die Inkrement- bzw. Dekrementoperation als eigene Anweisung schreibt oder zumindest die ganze Anweisung so umformuliert, daß keine Mißverständnisse auftreten können.
Anweisungen wie
iResult = iCount * ++iCount;
sind auf alle Fälle zu vermeiden! Welcher Wert von iCount wird für die beiden Operanden jeweils genommen? Eine bessere Variante dieser schlecht programmierten Anweisung ist
iCount++;
iResult = iCount * iCount;
Für versierte C-Programmierer gehört die Verwendung dieser beiden Operatoren zum täglichen Brot; Inkrementieren und Dekrementieren eines Variablenwerts um den Wert 1 unter Zuhilfenahme von + 1 und - 1 wirkt amateurhaft. Dies aus gutem Grund: Die Verwendung von "++" und "--" sorgt für effizienten Programmcode, weil der Compiler diese Operationen in eine einzige Maschinenanweisung übersetzt. Dies ist bei der Addition und Subtraktion nicht unbedingt der Fall und hängt von seinen Optimierungs-Fähigkeiten ab.