Bug do java? [Resolvido]

Sou novato aqui, mas em outro post que criei deu pra ver q tem gente fera d+ no fórum. :shock:
Então, será q alguém consegue me explicar pq esse código imprime 0? Mostrei para várias pessoas da minha facul, inclusive professores mas a dúvida continua.

public class Classe{
    public static void main(String arg[]){
        int i = 0;
        i = i++;
        System.print(i);
}

Esse código faz parte de uma questão maior q só não resolvi pq não entendi oq acontece na linha 4.
Eu penso q se houve o incremento (i++) o i passaria a valer 1 (tal como acontece em c dependendo do compilador).
Vejo q nessa linha i = 0 (pq i++ no instante da atribuição é 0)… mas pra onde vai o incremento q ocorre logo após essa atribuição?

Grato! :smiley:

Cara tenta assim: ++i …
O incremento que voce fez só vem depois de ja ter atribuido a variavel o contador i++ á variavel i…
se voce fizer na linha 5 um i=i…irá ver que dai já foi incrementado e o valor é 1…
estuda um for()…que é um iterador que usa muito isso…dai voce vai entender bem…

Está correto ser 0 porque você primeiro associa e depois incrementa.

Se fosse

 i = ++i;  

Aí sim você primeiro incrementaria para depois associar.

Dá uma lida nisso aqui : http://www.guj.com.br/posts/list/77421.java , mais específicamente na resposta do Viny.

Galera, isso não um problema prático. É uma questão q vi em uma apostila e queria ententer o por que deste comportamento.
Como disse antes, mesmo a linha 4 sendo i =0, de fato ocorre o incremento… :frowning:
Talvez se eu perguntar de outra forma minha dúvida fique mais clara.

Pq em c o resultado é 1 e em java é 0? (A explicação do c não precisa falar. :wink: )

[quote=DanielLagares]Galera, isso não um problema prático. É uma questão q vi em uma apostila e queria ententer o por que deste comportamento.
Como disse antes, mesmo a linha 4 sendo i =0, de fato ocorre o incremento… :frowning:
Talvez se eu perguntar de outra forma minha dúvida fique mais clara.

Pq em c o resultado é 1 e em java é 0? (A explicação do c não precisa falar. :wink: )[/quote]

Porque a definição da ordem da avaliação das expressões em C é diferente (sutilmente diferente) da do Java.
Em Java, a ordem é rigorosamente definida na JLS (Java Language Specification).
Em C essa ordem não é bem-definida (na verdade depende da implementação), e é por isso que dá resultados diferentes.
Para ver como essa ordem não é bem definida, você pode tentar compilar esse programa em C em vários compiladores.
É bem capaz de o resultado ser diferente, por exemplo, se você compilar no Sun C++ (Solaris) ou no Microsoft visual C++ (Windows).

dê uma olhada em um tópico que criei quando tinha uma dúvida parecida: http://www.guj.com.br/posts/list/147558.java

Galera, até agora não fui compreendido.

vejam:

int i = 0;
i = i++;
System.out.println(i);

Esse codigo imprime 0.

int j,i = 0;
j = i++;
System.out.println(i);

Esse codigo imprime 1

Pq no primeiro o incremento é descartado? Traduzi até para linguagem de máquina para ver instrução por instrução mas não conseguir achar o o “bug”. :frowning:

Se você ler a JLS ( http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.7.1 ), vai ficar um pouco confuso no começo (nem vou tentar lhe explicar com base na especificação - isso fica por sua conta), mas:

i = i++;

equivale a

tmp = i; 
i = i + 1;
i = tmp;

e
ou seja, i = 0, e

j = i++;
equivale a

tmp = i;
i = i + 1;
j = tmp;

ou seja, j = 0, e i = 1.

[quote=DanielLagares]Galera, até agora não fui compreendido.

vejam:

int i = 0;
i = i++;
System.out.println(i);

Esse codigo imprime 0.

int j,i = 0;
j = i++;
System.out.println(i);

Esse codigo imprime 1

Pq no primeiro o incremento é descartado? Traduzi até para linguagem de máquina para ver instrução por instrução mas não conseguir achar o o “bug”. :frowning: [/quote]
Se no primeiro vc fizesse i++ em vez de i = i++, ae sim ele imprimiria 1.
No caso do segundo, se vc mandar imprimir o j, ele também vai tar valendo 0, mas o i vai estar valendo 1, pois primeiro ele passa o valor de i para j (i = 0 e j = 0) e depois incrementa i (i=1, j=0).

Agora se você fizer j= ++i em vez de j=i++, primeiro ele acrescenta o valor a variável, depois ele passa. Por isso i e j seriam 1.

Boa noite a todos.

Amigo voce está usando o bloco de notas :?:

Se estivesse utilizando uma IDE como o NetBeans ou Eclipse, está berraria logo o erro.

Isto porque a sintaxe abaixo está incorreta

    ...
    System.print(i);
    ...

O correto é:

    ....
    System.out.print(i);
    ....

Outra coisa que também não está correta é

   ...
   i = i++;
   // ou 
   i = ++i;

Nada impede de voce utilizar este código, porém eu considero isto redundância de recurso.

O valor está sendo 0 (zero) porque voce está incrementando a variável i depois, o seja i++, e ela faz referência a ela mesma quando voce a atribui o sinal de igual a ela mesma incrementada, seria como se fizesse uma cópia de i cuja cópia só receberia a incrementação na segunda vez que a instrução passase por esta sintaxe, se voce invertesse a incrementação com i = ++i, ai o resultado seria um, porque a incrementação ocorreria antes de passar para a próxima instrução e a cópia de i já a receberia incrementada.

Tente fazer assim:

public class Classe{   
    public static void main(String arg[]){   
        int i = 0;   
        i++;   
        System.print(i);   
}

E depois tente assim:

public class Classe{   
    public static void main(String arg[]){   
        int i = 0;   
        ++i;   
        System.out.print(i);   
}

Em ambos os casos acima, o resultado será sempre um, porque não outra referência de i a se atribuir, assim mesmo se a incrementação ocorrer antes ou depois de passar para a próxima sintaxe, a instrução System.out.print(i) sempre será a próxima instrução.

Muito obrigado entanglement! Realmente com a JLS fica fácil de entender (Apesar de estranha pra caramba)
Dúvida resolvida! E… não é bug! :smiley: