Namespaces
Variants

Increment/decrement operators

From cppreference.net

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

Operator-Präzedenz

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetik Logisch Vergleich Member
Zugriff
Sonstige

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(seit C11)
(bis C23)

alignof
(seit C23)

C++ Dokumentation für Increment/decrement operators