Post-Dekrement-Operator --

Der Post-Dekrement-Operator verringert den angegebenen Operanden um eine Einheit und speichert den Wert zurück in den Operanden. Für arithmetische Typen entspricht dies der Subtraktion mit 1. Im Gegensatz zum Pre-Decrement-Operator steht der Operator -- NACH dem Operanden und wird ausgeführt, NACHDEM der Operand zurückgegeben wurde.





5

4
#include <stdio.h>

int main(){
  int a = 5;
  printf("%d\n",  a);
  a--;
  printf("%d\n",  a);
  return 0;
}

Details

Der Post-Dekrement-Operator erwartet einen Operanden als lvalue und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein rvalue: Der Wert des (vorerst unveränderten) Operanden, der angegeben wurde.

Zwar ist der Post-Dekrement-Operator für sämtliche arithmetische Typen zulässig, jedoch wird er hauptsächlich bei Integer-Typen und bei Pointern angewendet. Wenn der Post-Inkrement-Operator auf einen Pointer angewendet wird, so wird der Pointer um eine Typ-Grösse verringert.



5

4
int a[5] = {1, 2, 3, 4, 5};
int* b = &a[4];
printf("%d\n",  *b);
b--;
printf("%d\n",  *b);

Wenn der Operand als konstant deklariert ist, so gibt der Compiler einen Fehler wie etwa decrement of read-only variable, aus. Anmerkung: Ein (nicht als konstant deklarierter) Pointer, der auf einen konstanten Wert zeigt, kann selbstverständlich dekrementiert werden.

Durch die Subtraktion einer Einheit kann es bei arithmetischen Typen vorkommen, dass ein Underflow passiert, was bei Integer-Typen zu einem Wrap-Around führt



255
unsigned char a = 0;
a--;
printf("%d\n", a);

Der Post-Decrement-Operator ist ein Operator, bei welchem der Operand sowohl gelesen, als auch geschrieben wird. Dies kann in gewissen Fällen zu Unbestimmtheiten führen. Genauere Informationen darüber können bei den Sequenz-Punkten nachgelesen werden.

Der Unterschied des Post-Dekrement-Operators zum Pre-Decrement-Operator ist, dass der dekrementierte Wert in den Operanden zurückgeschrieben wird, NACHDEM der Operand als Rückgabewert verwendet wurde, wohingegen der Pre-Dekrement-Operator den Operanden zuerst verringert und ihn danach als Rückgabewert auffasst. Folgendes Beispiel verdeutlicht diesen Unterschied:


10
9
8
int a = 10;
printf("%d\n",  a--);
printf("%d\n",  a);
printf("%d\n",  --a);