[code]public class IteracaoEstranha{
public static void main(String[] args) {
int j = 0;
for(int i=0; i<100;i++) {
j = j++;
}
System.out.println(j);
}
}[/code]
Pessoal estive no Sun Tech Days 2007 e uma das palestrantes mostrou diversos códigos e dava alguma alternativas pra gente escolher, em uma das perguntas ela mostrou este código, e até agora não consegui entender, pois pensava de um jeito e fiz um teste colocando
j = ++j;
acreditando que não funcionaria, mas assim funciona acabando com a minha tese.
Alguém poderia me explicar, ou alguém que foi a palestra
Vlw ![:slight_smile: :slight_smile:](https://www.guj.com.br/images/emoji/twitter/slight_smile.png?v=9)
E o resultado ainda da 0 hahahahah q doideira…
Desculpe não está errado, eu não consigo entender porque o valor final de ‘j’ sempre será ‘0’ (Zero)… :?:
pra deveria de dar 100…mas ele não sai do zero
Está certo, vai dar zero mesmo.
j recebe j e depois é incrementado, só que uma instância diferente.
Tanto é que se você for compilar numa IDE, Eclipse por exemplo, lá mesmo será dito que isso é um trecho sem efeito.
essa parte da instância diferente não compreendi, eu ja debuguei o código e num da nenhuma dica do q acontece.
Obs: Porcaria do meu Eclipse nem falou isso :evil:
Não é porcaria de Eclipse, hehehe…
Na verdade você tem que definir os níveis de mensagens ao compilar, no menu:
Window -> Preferences -> Java -> Compiler -> Errors/Warnings
O que faz o j++?
Ele retorna o valor de j e depois incrementa j.
O que acontece com j = j++ ?
- A JVM avalia o valor da expressão j++ (Que é zero)
- A JVM incrementa o valor de j (de 0 para 1)
- A JVM seta o valor da expressão pegado no primeiro passo na variavel j (setando o valor de j de volta para zero)
Para quem manja de bytecode do Java - ele faz o seguinte:
iload_1 j // pega o valor de j e joga na pilha
iinc j 1 // incrementa o valor de j
istore_1 j // pega o valor da pilha e seta no j
[]s,
Sami