Pre-Increment- und Post-Increment-Operatoren in C++

Jinku Hu 12 Oktober 2023
  1. Unterschied zwischen Pre-Increment- und Post-Increment-Operationen in C++
  2. Verwendung von keine Post-Inkrement- und Pre-Increment-Operationen mit anderen arithmetischen Operationen derselben Variablen
Pre-Increment- und Post-Increment-Operatoren in C++

In diesem Artikel werden die Unterschiede zwischen Pre-Increment und Post-Increment in C++ vorgestellt.

Unterschied zwischen Pre-Increment- und Post-Increment-Operationen in C++

Beide Operationen basieren auf dem unären Inkrementoperator - ++, der sich bei Verwendung in Ausdrücken, bei denen auf den Wert der Variablen zugegriffen wird, etwas anders verhält. Im Allgemeinen kann eine Variable mit einem Inkrement- oder Dekrement-Operator nach oder vor kombiniert werden, was den Wert größer/kleiner um 1 ergibt. Beachten Sie jedoch, dass die Vor-Inkrement-Operation die gegebene Variable zuerst ändert und dann darauf zugreift. Andererseits greift der Post-Inkrement-Operator auf den ursprünglichen Wert zu und inkrementiert ihn dann. Bei Verwendung in einem Ausdruck, bei dem auf den Wert zugegriffen oder dieser gespeichert wird, kann der Operator also unterschiedliche Auswirkungen auf das Programm haben. Der folgende Beispielcode initialisiert beispielsweise die beiden Ganzzahlen auf 0-Werte und iteriert dann fünfmal, während die inkrementierten Werte für jeden mit unterschiedlichen Operatoren ausgegeben werden. Beachten Sie, dass die Nach-Inkrementierung mit 0 beginnt und mit 4 endet, während die Vor-Inkrementierung mit 1 beginnt und mit 5 endet. Trotzdem ist der in beiden Ganzzahlen gespeicherte Endwert gleich - 5.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    cout << "i: " << i++ << "  ";

    cout << "j: " << ++j << endl;
  }

  cout << "End of the loop, both have equal values:" << endl;
  cout << "i: " << i << "  "
       << "j: " << j << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

i: 0  j: 1
i: 1  j: 2
i: 2  j: 3
i: 3  j: 4
i: 4  j: 5
End of the loop, both have equal values:
i: 5  j: 5

Alternativ verhält sich die Verwendung der unterschiedlichen Notationen innerhalb des bedingten Ausdrucks der for-Schleife gleich. Beide Schleifen erhalten 5 Iterationen. Allerdings ist es in der Regel üblich, Pre-Increment zu verwenden, was eine leistungseffizientere Variante sein kann, wenn der Code nicht optimiert ist.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    cout << "i: " << i++ << "  ";

    cout << "j: " << ++j << endl;
  }

  cout << "End of the loop, both have equal values:" << endl;
  cout << "i: " << i << "  "
       << "j: " << j << endl;
  cout << endl;

  for (int k = 0; k < 5; ++k) {
    cout << k << " ";
  }
  cout << endl;

  for (int k = 0; k < 5; k++) {
    cout << k << " ";
  }
  cout << endl;

  exit(EXIT_SUCCESS);
}

Ausgabe:

i: 0  j: 1
i: 1  j: 2
i: 2  j: 3
i: 3  j: 4
i: 4  j: 5
End of the loop, both have equal values:
i: 5  j: 5

0 1 2 3 4
0 1 2 3 4

Verwendung von keine Post-Inkrement- und Pre-Increment-Operationen mit anderen arithmetischen Operationen derselben Variablen

Beachten Sie, dass Post-Inkrement- und Pre-Inkrement-Operatoren arithmetische Berechnungen völlig falsch machen können, wenn sie mit derselben Variablen verwendet werden. Wenn Sie beispielsweise das Post-Inkrement mit der Multiplikation derselben Variablen kombinieren, ist Code unintuitiv zu lesen und sogar fehleranfällig, wenn er nicht mit ausreichender Sorgfalt behandelt wird.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> vec1 = {10, 22, 13, 41, 51, 15};

  for (int &k : vec1) {
    cout << k++ * k << ", ";
  }

  exit(EXIT_SUCCESS);
}

Ausgabe:

110, 506, 182, 1722, 2652, 240,
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Operator