Increment/decrement operators
Inkrement-/Dekrementoperatoren sind unäre Operatoren, die den Wert einer Variable um 1 erhöhen/verringern.
Sie können Postfix-Form haben:
Ausdruck
++
|
|||||||||
Ausdruck
--
|
|||||||||
Sowie die Präfixform:
++
expr
|
|||||||||
--
expr
|
|||||||||
Der Operand
expr
sowohl für Präfix- als auch Postfix-Inkrement oder -Dekrement muss ein
modifizierbarer Lvalue
von
Ganzzahltyp
(einschließlich
_Bool
und Enumerationen), Gleitkommatyp oder Zeigertyp sein. Er kann cvr-qualifiziert, unqualifiziert oder
atomic
sein.
Das Ergebnis der Postfix-Inkrement- und Dekrement-Operatoren ist der Wert von expr .
Das Ergebnis des Präfix-Inkrementoperators ist das Ergebnis der Addition des Werts
1
zum Wert von
expr
: Der Ausdruck
++
e
ist äquivalent zu
e
+
=
1
. Das Ergebnis des Präfix-Dekrementoperators ist das Ergebnis der Subtraktion des Werts
1
vom Wert von
expr
: Der Ausdruck
--
e
ist äquivalent zu
e
-
=
1
.
Inkrement-Operatoren bewirken als Nebeneffekt das Hinzufügen des Werts
1
des entsprechenden Typs zum Operanden. Dekrement-Operatoren bewirken als Nebeneffekt das Subtrahieren des Werts
1
des entsprechenden Typs vom Operanden. Wie bei allen anderen Nebeneffekten werden diese Operationen spätestens beim nächsten
Sequenzpunkt
abgeschlossen.
int a = 1; int b = a++; // speichert 1+a (was 2 ist) in a // gibt den alten Wert von a (was 1 ist) zurück // Nach dieser Zeile gilt: b == 1 und a == 2 a = 1; int c = ++a; // speichert 1+a (was 2 ist) in a // gibt 1+a (was 2 ist) zurück // nach dieser Zeile gilt: c == 2 und a == 2
|
Post-Inkrement oder Post-Dekrement auf jeder atomaren Variable ist eine atomare Lese-Modifizieren-Schreibe-Operation mit Speicherreihenfolge memory_order_seq_cst . |
(seit C11) |
Siehe arithmetische Operatoren für Einschränkungen bei der Zeigerarithmetik sowie für implizite Konvertierungen, die auf die Operanden angewendet werden.
Inhaltsverzeichnis |
Hinweise
Aufgrund der beteiligten Nebeneffekte müssen Inkrement- und Dekrementoperatoren mit Vorsicht verwendet werden, um undefiniertes Verhalten aufgrund von Verstößen gegen die 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 keine Auswirkung auf imaginäre Typen, und eine Implementierung, die
i
für imaginäre Zahlen aber
1
für komplexe Zahlen addieren/subtrahieren würde, würde
0+yi
anders behandeln als
yi
.
Im Gegensatz zu C++ (und einigen Implementierungen von C) sind Inkrement-/Dekrement-Ausdrücke niemals selbst Lvalues: & ++ a ist ungültig.
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
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.5.2.4 Postfix-Inkrement- und -Dekrementoperatoren (S.: TBD)
-
- 6.5.3.1 Präfix-Inkrement- und -Dekrementoperatoren (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.5.2.4 Postfix-Inkrement- und -Dekrementoperatoren (S.: TBD)
-
- 6.5.3.1 Präfix-Inkrement- und -Dekrementoperatoren (S.: TBD)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.5.2.4 Postfix-Inkrement- und -Dekrementoperatoren (S. 85)
-
- 6.5.3.1 Präfix-Inkrement- und -Dekrementoperatoren (S. 88)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.5.2.4 Postfix-Inkrement- und -Dekrement-Operatoren (S. 75)
-
- 6.5.3.1 Präfix-Inkrement- und -Dekrement-Operatoren (S. 78)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 3.3.2.4 Postfix-Inkrement- und -Dekrement-Operatoren
-
- 3.3.3.1 Präfix-Inkrement- und -Dekrement-Operatoren
Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung |
Inkrement
Dekrement |
Arithmetik | Logisch | Vergleich |
Member
Zugriff |
Sonstige |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
|
C++ Dokumentation
für
Increment/decrement operators
|