Operadores Pre-Incremento VS Post-Incremento en C++

Jinku Hu 12 octubre 2023
  1. Diferencia entre operaciones de preincremento y posincremento en C++
  2. No utilice operaciones posteriores al incremento y previas al incremento con otras operaciones aritméticas de la misma variable
Operadores Pre-Incremento VS Post-Incremento en C++

Este artículo presentará las diferencias entre preincremento y postincremento en C++.

Diferencia entre operaciones de preincremento y posincremento en C++

Ambas operaciones se basan en el operador de incremento unario - ++, que tiene un comportamiento ligeramente diferente cuando se usa en expresiones donde se accede al valor de la variable. Generalmente, una variable se puede combinar con un operador de incremento o decremento después o antes de que produzca un valor mayor / menor en 1. Sin embargo, tenga en cuenta que la operación de preincremento modifica la variable dada al principio y luego accede a ella. Por otro lado, el operador de post-incremento accede al valor original y luego lo incrementa. Por lo tanto, cuando se usa en una expresión donde se accede o se almacena el valor, el operador puede tener diferentes efectos en el programa. Por ejemplo, el siguiente código de ejemplo inicializa los dos enteros a valores 0 y luego itera cinco veces mientras genera los valores incrementados para cada uno con diferentes operadores. Tenga en cuenta que el incremento posterior comienza a imprimirse con 0 y termina con 4, mientras que el incremento previo comienza con 1 y termina con 5. Sin embargo, el valor final almacenado en ambos enteros es el mismo - 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);
}

Producción :

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

Alternativamente, usar las diferentes notaciones dentro de la expresión condicional del bucle for se comporta de la misma manera. Ambos bucles se ejecutan en 5 iteraciones. Aunque, por lo general, se acepta el estilo de usar el preincremento, que puede ser una variante más eficiente en el rendimiento cuando el código no está optimizado.

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

Producción :

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

No utilice operaciones posteriores al incremento y previas al incremento con otras operaciones aritméticas de la misma variable

Tenga en cuenta que los operadores de postincremento y preincremento pueden hacer que los cálculos aritméticos sean completamente erróneos cuando se utilizan con la misma variable. Por ejemplo, la combinación del incremento posterior con la multiplicación de la misma variable hace que el código de lectura no sea intuitivo e incluso sea propenso a errores si no se trata con suficiente diligencia.

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

Producción :

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

Artículo relacionado - C++ Operator