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! 
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… 
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.
)
[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… 
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.
)[/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”. 
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”.
[/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! 