Operatori pre-incremento VS post-incremento in C++

Jinku Hu 12 ottobre 2023
  1. Differenza tra operazioni pre-incremento e post-incremento in C++
  2. Non utilizzare operazioni post-incremento e pre-incremento con altre operazioni aritmetiche della stessa variabile
Operatori pre-incremento VS post-incremento in C++

Questo articolo introdurrà le differenze tra pre-incremento e post-incremento in C++.

Differenza tra operazioni pre-incremento e post-incremento in C++

Entrambe le operazioni si basano sull’operatore di incremento unario - ++, che ha un comportamento leggermente diverso quando viene utilizzato nelle espressioni in cui si accede al valore della variabile. Generalmente, una variabile può essere combinata con l’operatore di incremento o decremento dopo o prima che produca il valore più grande/più piccolo di 1. Nota però, l’operazione di pre-incremento modifica prima la variabile data e poi vi accede. D’altra parte, l’operatore di post-incremento accede al valore originale e poi lo incrementa. Pertanto, quando viene utilizzato in un’espressione in cui si accede o si memorizza il valore, l’operatore può avere effetti diversi sul programma. Ad esempio, il seguente codice di esempio inizializza i due interi a valori 0 e quindi esegue un’iterazione cinque volte mentre emette i valori incrementati per ciascuno con operatori diversi. Si noti che il post-incremento inizia a stampare con 0 e termina con 4, mentre il pre-incremento inizia con 1 e termina con 5. Tuttavia, il valore finale memorizzato in entrambi i numeri interi è lo stesso - 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);
}

Produzione:

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

In alternativa, l’uso delle diverse notazioni all’interno dell’espressione condizionale del cicli for si comporta allo stesso modo. Entrambi i cicli vengono eseguiti 5 iterazioni. Tuttavia, è generalmente accettato lo stile di utilizzare il pre-incremento, che può essere una variante più efficiente in termini di prestazioni quando il codice non è ottimizzato.

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

Produzione:

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

Non utilizzare operazioni post-incremento e pre-incremento con altre operazioni aritmetiche della stessa variabile

Si noti che gli operatori post-incremento e pre-incremento possono rendere i calcoli aritmetici completamente errati se utilizzati con la stessa variabile. Ad esempio, combinare il post-incremento con la moltiplicazione della stessa variabile rende il codice non intuitivo da leggere e persino soggetto a errori se non trattato con sufficiente diligenza.

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

Produzione:

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

Articolo correlato - C++ Operator