Inkrement-/Dekrementoperatoren
Inkrement-/Dekrementoperatoren sind unäre Operatoren, die den Wert einer Variablen um 1 erhöhen/verringern.
Sie können eine Postfix-Form haben
expr ++ |
|||||||||
expr -- |
|||||||||
Sowie eine Prefix-Form
++ expr |
|||||||||
-- expr |
|||||||||
Der Operand expr sowohl für den Präfix- als auch für den Postfix-Inkrement- oder Dekrementoperator muss ein modifizierbares lvalue vom Ganzzahltyp (einschließlich _Bool und enums), reellen Gleitkommatyp oder Zeigertyp sein. Er kann cvr-qualifiziert, unverändert oder atomar sein.
Das Ergebnis der Postfix-Inkrement- und Dekrementoperatoren ist der Wert von expr.
Das Ergebnis des Präfix-Inkrementoperators ist das Ergebnis des Addierens des Wertes 1 zum Wert von expr: der Ausdruck ++e ist äquivalent zu e += 1. Das Ergebnis des Präfix-Dekrementoperators ist das Ergebnis des Subtrahierens des Wertes 1 vom Wert von expr: der Ausdruck --e ist äquivalent zu e -= 1.
Inkrementoperatoren initiieren den Nebeneffekt des Addierens des Wertes 1 des entsprechenden Typs zum Operanden. Dekrementoperatoren initiieren den Nebeneffekt des Subtrahierens des Wertes 1 des entsprechenden Typs vom Operanden. Wie bei jedem anderen Nebeneffekt werden diese Operationen an oder vor dem nächsten Sequenzpunkt abgeschlossen.
int a = 1; int b = a++; // stores 1+a (which is 2) to a // returns the old value of a (which is 1) // After this line, b == 1 and a == 2 a = 1; int c = ++a; // stores 1+a (which is 2) to a // returns 1+a (which is 2) // after this line, c == 2 and a == 2
|
Post-Inkrement oder Post-Dekrement auf einer beliebigen atomaren Variablen ist eine atomare Lese-Modifikations-Schreib-Operation mit Speicherordnung memory_order_seq_cst. |
(seit C11) |
Siehe arithmetische Operatoren für Einschränkungen bei der Zeigerarithmetik sowie für implizite Konvertierungen der Operanden.
Inhalt |
[edit] Anmerkungen
Aufgrund der beteiligten Nebeneffekte müssen Inkrement- und Dekrementoperatoren mit Sorgfalt verwendet werden, um undefiniertes Verhalten durch Verletzungen der Sequenzierungsregeln zu vermeiden.
Inkrement-/Dekrementoperatoren sind für komplexe oder imaginäre Typen nicht definiert: Die übliche Definition des Addierens/Subtrahierens der reellen Zahl 1 hätte keinen Effekt auf imaginäre Typen, und die Definition, dass sie i für imaginäre, aber 1 für komplexe Zahlen addiert/subtrahiert, hätte dazu geführt, dass 0+yi anders behandelt wird als yi.
Im Gegensatz zu C++ (und einigen Implementierungen von C) sind die Inkrement-/Dekrementausdrücke selbst niemals lvalues: &++a ist ungültig.
[edit] Beispiel
#include <stdio.h> #include <stdlib.h> int main(void) { int a = 1; int b = 1; printf("original values: a == %d, b == %d\n", a, b); printf("result of postfix operators: a++ == %d, b-- == %d\n", a++, b--); printf("after postfix operators applied: a == %d, b == %d\n", a, b); printf("\n"); // Reset a and b. a = 1; b = 1; printf("original values: a == %d, b == %d\n", a, b); printf("result of prefix operators: ++a == %d, --b == %d\n", ++a, --b); printf("after prefix operators applied: a == %d, b == %d\n", a, b); }
Ausgabe
original values: a == 1, b == 1 result of postfix operators: a++ == 1, b-- == 1 after postfix operators applied: a == 2, b == 0 original values: a == 1, b == 1 result of prefix operators: ++a == 2, --b == 0 after prefix operators applied: a == 2, b == 0
[edit] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.5.2.4 Postfix-Inkrement- und Dekrementoperatoren (p: TBD)
- 6.5.3.1 Präfix-Inkrement- und Dekrementoperatoren (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 6.5.2.4 Postfix-Inkrement- und Dekrementoperatoren (p: TBD)
- 6.5.3.1 Präfix-Inkrement- und Dekrementoperatoren (p: TBD)
- C11-Standard (ISO/IEC 9899:2011)
- 6.5.2.4 Postfix-Inkrement- und Dekrementoperatoren (p: 85)
- 6.5.3.1 Präfix-Inkrement- und Dekrementoperatoren (p: 88)
- C99-Standard (ISO/IEC 9899:1999)
- 6.5.2.4 Postfix-Inkrement- und Dekrementoperatoren (p: 75)
- 6.5.3.1 Präfix-Inkrement- und Dekrementoperatoren (p: 78)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.3.2.4 Postfix-Inkrement- und Dekrementoperatoren
- 3.3.3.1 Präfix-Inkrement- und Dekrementoperatoren
[edit] Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung | Inkrement Dekrement |
Arithmetik | Logisch | Vergleich | Member Zugriff |
Sonstiges |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| C++-Dokumentation für Inkrement-/Dekrementoperatoren
|