package com.pre_incremento_pos_incremento;
public class PreIncrementoPosIncrementoClass {
public static void main(String[] args) {
int numero_repeticao = 0;
int j = 0;
numero_repeticao = numero_repeticao++;
j = numero_repeticao++;
}
}
}
Olá! A minha dúvida é a seguinte. Na linha 10, eu estou pós incrementando a minha variável e atribuindo o seu valor a ela mesma. Eu esperaria o seguinte:
1-na execução da linha 10, numero_repeticao tem valor inicial igual a 0. Este não será ainda incrementado, pois usa-se o pós incremento. Será atribuído a numero_repetição valor igual a 0.
2-na execução da linha 12, numero_repeticao possui agora valor 1, pois é incrementado antes dessa linha ser executada. j receberá 1 quando da execução de linha, pois mais uma vez, numero_repeticao está sendo utilizado com pós incremento.
Problema: ao depurar, vi que o valor da variável numero_repeticao é zero quando chega na linha 12. Como disse, esperaria 1.
Esse é um erro bastante interessante, tive que recorrer à especificação do Java para entender. Vamos lá.
Primeiro tenho que dizer que não é um erro, a linguagem está especificada assim.
Vamos escrever a expressão:int x = 1;
x = x++;Temos muita coisa acontecendo aí. Primeiro, como funciona o operador postfixde verdade?
A especificação diz: [quote]The value of the postfix increment expression is the value of the variable before the new value is stored.[/quote]
Eu adicionei o negrito
Então, a expressão à direita do operador de igualdade está sendo avaliada, vamos usar uma variável para indicar o valor que ela terá. A variável result. A especificação diz que ela terá o valor da variável original antes da atribuição, então é o valor dela mesma:int result = xApós isso, o que acontece? Como o postfix tem precedência maior, ele é executado antes da atribuiçãox++ // x tem valor 2E agora, a nossa variável é atribuída ao nosso valor original:x = result //result tinha valor 1Então resumindox = x++ É equivalente à: int result = x;
x++;
x = result;Entendeu?