Namensräume
Varianten
Aktionen

Inkrement-/Dekrementoperatoren

Von cppreference.com
< c‎ | Sprache

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

Operatorrangfolge

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

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 Inkrement-/Dekrementoperatoren