Opérateurs de pré-incrémentation VS de post-incrémentation en C++

Jinku Hu 12 octobre 2023
  1. Différence entre les opérations de pré-incrémentation et de post-incrémentation en C++
  2. N’utilisez pas d’opérations post-incrémentation et pré-incrémentation avec d’autres opérations arithmétiques de la même variable
Opérateurs de pré-incrémentation VS de post-incrémentation en C++

Cet article présentera les différences entre le pré-incrément et le post-incrément en C++.

Différence entre les opérations de pré-incrémentation et de post-incrémentation en C++

Les deux opérations sont basées sur l’opérateur d’incrémentation unaire - ++, qui a un comportement légèrement différent lorsqu’il est utilisé dans des expressions où la valeur de la variable est accessible. En règle générale, une variable peut être combinée avec un opérateur d’incrémentation ou de décrémentation après ou avant, ce qui donne une valeur plus grande/plus petite de 1. Notez cependant que l’opération de pré-incrémentation modifie d’abord la variable donnée, puis y accède. D’autre part, l’opérateur de post-incrémentation accède à la valeur d’origine puis l’incrémente. Ainsi, lorsqu’il est utilisé dans une expression où la valeur est accédée ou stockée, l’opérateur peut avoir différents effets sur le programme. Par exemple, l’exemple de code suivant initialise les deux entiers aux valeurs 0, puis itère cinq fois tout en affichant les valeurs incrémentées pour chacun avec des opérateurs différents. Notez que le post-incrément commence à imprimer par 0 et se termine par 4, tandis que le pré-incrément commence par 1 et se termine par 5. Néanmoins, la valeur finale stockée dans les deux entiers est la même - 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);
}

Production:

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

Alternativement, l’utilisation des différentes notations dans l’expression conditionnelle de la boucle for se comporte de la même manière. Les deux boucles sont exécutées 5 itérations. Cependant, il est généralement accepté d’utiliser le pré-incrément, ce qui peut être une variante plus efficace en termes de performances lorsque le code n’est pas optimisé.

#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);
}

Production:

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

N’utilisez pas d’opérations post-incrémentation et pré-incrémentation avec d’autres opérations arithmétiques de la même variable

Notez que les opérateurs post-incrémentation et pré-incrémentation peuvent rendre les calculs arithmétiques entièrement erronés lorsqu’ils sont utilisés avec la même variable. Par exemple, combiner le post-incrément avec la multiplication de la même variable rend le code peu intuitif à lire et même sujet aux erreurs s’il n’est pas traité avec suffisamment de diligence.

#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);
}

Production:

110, 506, 182, 1722, 2652, 240,
Auteur: 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

Article connexe - C++ Operator