Dúvida com operador i++ na questão

Olá Pessoal!!

Eu não consegui entender a questão abaixo, alguém poderia explicar:

class EBH105 {
  static int m(int i) {System.out.print(i + ","); return 0;}
  public static void main (String[] args) {
    int i = 0; i = i++ + m(i); System.out.print(i);
}}

What is the result of attempting to compile and run the above program?
a. Prints: 0,0
b. Prints: 1,0
c. Prints: 0,1
d. Prints: 1,1
e. Run-time error
f. Compile-time error
g. None of the above

Obrigada
Cíntia :-o

EDIT (Moderador) - Por favor, use as tags [ code ] para formatar código-fonte.

Acho que é assim:

i = 0
m(0) -> Escreve 0,
i = i + 0 --> i = 0
i++
Escreve 1

Letra C.

Eu compilei e rodei o programa acima, e deu

1,0

Esse é o tipo de coisa que se esperaria cair em uma prova de SCJP 1.4 mas não numa de 5.0 ou 6.0 - pois é uma coisa que não deve ser usada na vida real; serve só para "quebrar a cabeça", e convenhamos, o que menos se quer em código profissional é que ele seja um "quebra-cabeças".
De qualquer maneira, lá vai a explicação:

int i = 0; --> o valor de i é 0
i = i++ + m (i); --> vamos acompanhar o que ocorre.

Note que no caso i++ + m(i) temos que se avalia primeiramente i++ (uma expressão que retorna 0, e cujo efeito colateral é incrementar i), e depois m(i) (que também é uma expressão que retorna 0, e cujo efeito colateral é imprimir o valor de i, que nesse momento valerá 1. Então o que é impresso, aqui, é "1,".)
Como i++ retornou 0 e m(i) retornou 0, então a soma é 0, e atribuída a i faz com que i valha 0.
O que ocorre a seguir é imprimir o valor de i, que é "0".

Então o que será impresso é "1,0".

Só. O ++ é avaliado depois do i, e não depois do i + m(i).

Imprime a letra B. mais é difícil entender porque.

[quote=thingol]Esse é o tipo de coisa que se esperaria cair em uma prova de SCJP 1.4 mas não numa de 5.0 ou 6.0 - pois é uma coisa que não deve ser usada na vida real; serve só para "quebrar a cabeça", e convenhamos, o que menos se quer em código profissional é que ele seja um "quebra-cabeças".
De qualquer maneira, lá vai a explicação:

int i = 0; --> o valor de i é 0
i = i++ + m (i); --> vamos acompanhar o que ocorre.

Note que no caso i++ + m(i) temos que se avalia primeiramente i++ (uma expressão que retorna 0, e cujo efeito colateral é incrementar i), e depois m(i) (que também é uma expressão que retorna 0, e cujo efeito colateral é imprimir o valor de i, que nesse momento valerá 1. Então o que é impresso, aqui, é "1,".)
Como i++ retornou 0 e m(i) retornou 0, então a soma é 0, e atribuída a i faz com que i valha 0.
O que ocorre a seguir é imprimir o valor de i, que é "0".

Então o que será impresso é "1,0".
[/quote]

Olá Thingol

Eu não entendi o que vc quis dizer com i++ retornar ZERO, quer dizer que primeiro vai ser realizada a expressão:
i = i + m (i); atribuído a i, e depois o i vai ser incrementado i++?

Você viu que até o Victor caiu nessa. Vamos explicar com mais detalhes.

i = i++ + m(i)

Isso quer dizer que:

  1. Vamos obter o valor de i++.
  2. Vamos obter o valor de m(i).
  3. Vamos obter o resultado da soma de i++ com m(i).
  4. Vamos atribuir esse resultado a i.

No primeiro item, i++ é uma expressão cujo valor é o valor anterior de i (que nesse caso é zero), e cujo efeito colateral é incrementar i (ou seja, depois disso i fica valendo 1). Então i++ tem o valor 0, não 1.

No segundo item, m(i) chama o método m com o valor i = 1. Esse método, como você viu, sempre retorna 0.

No terceiro item, soma-se o resultado de i++ (que é 0) com o valor de m(i) (que é 0).

Realmente essa questão é meio chatinha, e é por isso que eu digo que se caísse uma dessa na minha prova eu deixaria para o fim.

Quando você disse que não é questão pra cair na 1.5 e 1.6 você quis dizer que foi excluído esse tipo de questão das provas?

É que a matéria ficou bem mais complexa (generics, annotations etc.) e tal tipo de coisa (“quanto é i = ++i + i++” ou coisa parecida, que é coisa de professor que aprendeu applets há 10 anos atrás e nunca mais se atualizou) não cai com tal nível de profundidade.

Em vez disso, procure saber as classes de java.util que estão no Java Collections Framework, por exemplo.

Value!!!hehehe, tomara que não caia mais mesmo…

Cair cai, mas não tão difícil assim. OK?