Pre-Dekrement-Operator --

Der Pre-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 Post-Decrement-Operator steht der Operator -- VOR dem Operanden und wird ausgeführt, BEVOR der Operand zurückgegeben wird.





5

4
#include <stdio.h>

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

Details

Der Pre-Dekrement-Operator erwartet einen Operanden als lvalue und wird von rechts nach links abgearbeitet. Der Rückgabewert ist in C ein rvalue: Der Wert des (mittlerweile veränderten) Operanden, der angegeben wurde. In C++ ist der Rückgabewert ein lvalue: Der (mittlerweile veränderte) Operand selbst.

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




5

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

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;
printf("%d\n",  --a);

Der Pre-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 Pre-Dekrement-Operators zum Post-Decrement-Operator ist, dass der dekrementierte Wert in den Operanden zurückgeschrieben wird, BEVOR der Operand als Rückgabewert verwendet wird, wohingegen der Post-Dekrement-Operator den Operanden zuerst als Rückgabewert auffasst und ihn danach verringert. Folgendes Beispiel verdeutlicht diesen Unterschied:


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