Para "facilitar a explicacao" entenda a semantica de seu programa :

int i = 1;                      cria-se uma variavel do tipo primitivo int
com valor 2

i += i++;

O que o COMPILADOR faz ?

// i += i++;            faz um "parse" de seu código e substitui essa linha
pela debaixo
i = i + i++;





O que o Java faz em TEMPO DE EXECUÇÃO ?

Por prioridade, é resolvido ANTES a expressao DEPOIS é feita a atribuição
(direita para esquerda)

     2º            1º
<atribuição> = <expressao>

Porém, repare que você utilizou um POS incremento, sendo assim (i++) só será
validado APÓS a expressão ser resolvida.

    i      =   i  +  i++

Resultado ? O compilador irá calcular (i + i), ou seja (1 + 1) que desde que
eu nasci sempre valeu DOIS !




E agora ? 
É feito o POS-INCREMENTO em i ...

        (um "break")
                Pergunta : Quanto vale o "i" agora ?
                Resposta : UM, pois AINDA ESTAMOS VALIDANDO A EXPRESSAO.
Lembre-se das prioridade descritas acima !
                       Não foi feita NENHUMA atribuição para a variável "i"
ainda ...
        (voltando ...)

Calculando o pos-incremento (i++) o resultado de "i" valerá DOIS ! Ou seja,
i = i + 1 que vale 2.





Ok ... Ok .... Então "i" agora vale 2 e a expressão vale quanto ?
Já fizemos ANTES e sabemos que vale DOIS !!!





Legal ! Então sabemos que a EXPRESSAO vale 2. O que falta fazer ? 
Só a ATRIBUIÇÃO !!! MOLEZA !!!!

        i += 2    então    i = 3      ??????          Putz ! Fudeu, e agora
?!?!?!?

ERRADO !!!!!  LEMBRE-SE QUE O COMPILADOR JÁ MUDOU ESSA SEMANTICA NO MOMENTO
DE "parsing" !!!

?!?!?!?!?!

LEIA NO COMEÇO DO E-MAIL !!!!! 
(EU ESPERO AQUI UM POUCO ATÉ VOCE OLHAR .........)

Então, continuando ...

        i = <resultado da expressao>    , ou seja      i = 2   !!!!!!


        Mas e o "i" do POS-INCREMENTO que já valia "2" também ?!?!?!?

        
        Ora !!!! O "i" que foi calculado como DOIS foi SUBSTITUIDO pelo NOVO
valor da expressão calculada.
        Ou seja, DOIS !!!!!



        Como ?!?!? Imagine algo meio "esquisito" do tipo :

        i = 10 + 10;               // "i" valerá 20
        i = 2;
        System.out.println(i);     // Adivinhe quanto vale o "i" ?



        Esse exemplo é TIPICO DE PROVA !!!!!!! Bons estudos !!!!!


THE END


 
Abraç[]s,
 
Max Ricardo Mercurio Ribeiro
IT & Business Consultant for Alcoa Company
 
e-mail: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> (company)
/ [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> (personal)
phones # : (0x11) 9101-5511 mob. / (0x11) 3741-4418 com. 


-----Original Message-----
From: Tenisson Chaves dos Santos Júnior
[mailto:[EMAIL PROTECTED]] 
Sent: Wednesday, 15 de January de 2003 1:31 PM
To: [EMAIL PROTECTED]
Subject: [java-list] Dúvida em código


Pessoal,

 No código abaixo , eu esperava obter  "3" no valor da variável i. No
entanto , o valor retornado é "2" .  Alguém poderia me explicar o porquê
disso ?

public class Teste{
        public static void main(String args[]) {
                int i=1 ;
                i += i++ ;
                System.out.println(i);
        }
}

Obrigado,

Tenisson Chaves Jr.


------------------------------ LISTA SOUJAVA ---------------------------- 
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP 
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED] 
-------------------------------------------------------------------------

------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br  -  Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
historico: http://www.mail-archive.com/java-list%40soujava.org.br
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------

Responder a