Qual a diferença entre i++ e ++i?
Estou fazendo um aplicativo de finanças e uma das funcionalidades dele é calcular o valor total de todas as minhas compras em um dia. Para isso, tenho um método que recebe um array com os valores de cada uma das compras que eu fiz no dia:
public static double calculaTotal(double[] valores){
double totalHoje = 0.0;
int indice = 0; while(indice < valores.length){
double valor = valores[++indice];
totalHoje += valor;
Logger.log("Adicionando gasto no valor de: " + valor);
}
return totalHoje; }
O método percorre o array de valores, incrementa a variável totalHoje
com o cada um dos valores e imprime em meu log o que ele está fazendo.
Se testarmos esse método passando o array: double[] gastos = {30.0, 10.0, 20.0, 15.0, 25.0};
olha só o que acontece:
Vamos dar uma olhada no log para tentar entender qual o problema! O primeiro problema é que o método simplesmente "pulou" a primeira posição do array (que era 30.0). E o segundo é que eu levei um ArrayIndexOutOfBoundsException
, ou seja, tentei acessar uma posição do array de gastos que não existe. O que será que está causando isso no meu código?
Verificando melhor o meu método, percebi que o culpado de isso ter acontecido é que eu usei um ++indice
em vez de usar indice++
para incrementar a variável índice!
Você sabe qual é a diferença entre eles? Vamos lá!
++indice
vai incrementar o valor de indice e me retornar o valor já incrementado.indice++
vai me retornar o valor de indice no momento em que é chamado e depois incrementar esse valor.
Mas, calma aí, como isso funciona na prática? Vamos ver o exemplo abaixo:
int x = 5, y = 5;
System.out.println(++x); // imprime 6
System.out.println(x); // imprime 6
System.out.println(y++); // imprime 5
System.out.println(y); // imprime 6
Como eu chamei o ++indice
no método, logo a primeira vez que ele entrou no while
o valor de indice era 1, por isso ele "pulou" a primeira posição. E o segundo problema foi que meu índice ficou maior que o tamanho do array de gastos antes de ele passar pela condição do while
.
Então para eu consertar o meu método basta eu trocar ++indice
por indice++
e agora, olha o resultado:
Pronto! Agora sim funcionou da maneira como eu estava esperando!
Mas então, se o ++indice
é inútil para essa situação, qual seria uma situação em que poderíamos usar ele?
Geralmente o ++indice
é usado em retornos de métodos como por exemplo, quero um método que atualize o número de compras em um dia e já me retorne esse número atualizado, para isso faria:
public int atualizaERetornaNumeroDeCompras(){
return ++this.numeroDeCompras; }
De qualquer forma, não é uma boa prática escrevermos métodos assim, perceba que esse meu método está com duas responsabilidades diferentes, o ideal seria em meu método adicionaCompra(double valor) eu incrementar o número de compras e usar o getter para me retornar esse número atualizado.
Vimos que as vezes são os pequenos detalhes que fazem toda a diferença em nosso código e que precisamos prestar atenção no comportamento de cada um dos comandos que usamos para garantir que o código vai funcionar da maneira que esperamos. Você já sabia dessa diferença?
Você pode aprender mais sobre esse e outros comandos comuns à diferentes linguagens de programação no nosso curso de Lógica de Programação I: comece na carreira com JavaScript. Ainda, para garantir que bugs como esses não vão acabar indo pra produção você pode fazer nosso curso de Testes: TDD com Java.