Operadores pré-incremento VS pós-incremento em C++
- Diferença entre operações de pré-incremento e pós-incremento em C++
- Não use operações de pós-incremento e pré-incremento com outras operações aritméticas da mesma variável
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,
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