Operadores pré-incremento VS pós-incremento em C++

Jinku Hu 12 outubro 2023
  1. Diferença entre operações de pré-incremento e pós-incremento em C++
  2. Não use operações de pós-incremento e pré-incremento com outras operações aritméticas da mesma variável
Operadores pré-incremento VS pós-incremento em C++

Este artigo irá apresentar as diferenças entre pré-incremento e pós-incremento em C++.

Diferença entre operações de pré-incremento e pós-incremento em C++

Ambas as operações são baseadas no operador de incremento unário - ++, que tem um comportamento ligeiramente diferente quando usado em expressões onde o valor da variável é acessado. Geralmente, uma variável pode ser combinada com o operador de incremento ou decremento antes ou depois que produz o valor maior / menor em 1. Observe, porém, que a operação de pré-incremento modifica a variável dada primeiro e depois a acessa. Por outro lado, o operador pós-incremento acessa o valor original e o incrementa. Assim, quando usado em uma expressão onde o valor é acessado ou armazenado, o operador pode ter diferentes efeitos no programa. Por exemplo, o código de exemplo a seguir inicializa os dois inteiros para valores 0 e, em seguida, itera cinco vezes enquanto gera os valores incrementados para cada um com diferentes operadores. Observe que o pós-incremento começa a imprimir com 0 e termina com 4, enquanto o pré-incremento começa com 1 e termina com 5. No entanto, o valor final armazenado em ambos os inteiros é o mesmo - 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);
}

Resultado:

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 as diferentes notações dentro da expressão condicional do loop for se comporta da mesma forma. Ambos os loops são executados em 5 iterações. Embora seja geralmente aceito o estilo de usar o pré-incremento, que pode ser uma variante de desempenho mais eficiente quando o código não está otimizado.

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

Resultado:

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ão use operações de pós-incremento e pré-incremento com outras operações aritméticas da mesma variável

Observe que os operadores pós-incremento e pré-incremento podem tornar os cálculos aritméticos totalmente errôneos quando usados ​​com a mesma variável. Por exemplo, combinar o pós-incremento com a multiplicação da mesma variável torna o código não intuitivo para leitura e até mesmo sujeito a erros se não for tratado com diligência suficiente.

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

Resultado:

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

Artigo relacionado - C++ Operator