Qual a saída deste programa

Para o pessoal que está se preparando para a SCJP: Qual a saída deste programa?

public class Inc{
public static void main(String argv[]){
                Inc inc = new Inc();
                int i =0; 
                inc.fermin(i);
                i = i++;
                System.out.println(i);
        }
        void fermin(int i){
                i++;
        }
}

1

Errado… Alguém mais se habilita?

0

Pegadinha forte. Tem a ver com a precedência dos operadores na linha:

i = i++;

Que dá um resultado diferente se fosse:

i = ++i;

Ou então:

i += 1;

Estranho a atribuição ter precedência na adição! Essa expressão não teria o mesmo efeito de i = i +1???

A resposta é zero…

Como a função fermin(int i) retorna void então o valor da variável ‘i’ do main não é alterada. Então após a chamada de fermin(i) o ‘i’ continua zerado.

o i = i++ não soma depois atrivui. Ele atribui depois soma, se fosse i = ++i ele somaria depois atribuiria o valor 1.

Logo a resposta é zero. =o)

Acho q é isso.

Isso não tem a ver com o retorno no método, mesmo porque não existe uma atribuição do valor de retorno. Isso é uma pegadinha para aqueles que acham que a passagem de argumento é por referência e não por valor.

vc tem que ver que o (++) e o (–) são operadores unários a precedencia é outra.

De qualquer maneira, na minha prova do SCJP 5.0 não caiu esse tipo de sutileza.
(Só o fato de você ter de saber Serializable, generics (incluindo a parte de wildcards), e conhecer todas as classes de java.util.* que estão no Java Collections Framework na ponta da língua já é mais que suficiente.)
É bom saber esse tipo de sutileza, mas não é aquela coisa que vai lhe “reprovar”.

[quote=danieldestro]Pegadinha forte. Tem a ver com a precedência dos operadores na linha:

i = i++;

Que dá um resultado diferente se fosse:

i = ++i;

Ou então:

i += 1;[/quote]
O Daniel, porque ele atribui e depois soma???! Se fosse o inverso ( i = ++i ) ele retornaria um!

http://java.sun.com/docs/books/tutorial/java/nutsandbolts/expressions.html

A tabela mostra o ‘expr++’ e ‘expr–’ como de maior precedência e o igual como última, logo o ‘++’ tem precedência sobre o ‘=’ certo?!

Logo o resultado deveria ser 1.

Bizarro. Parece até bug.
Se for analisar, a questão não é se ele soma e depois retorna, ou se ele retorna e depois soma.
Analisando a expressão i = i++ eu imaginei que fosse o equivalente a:
i = i;
i = i + 1;
Mas na verdade o que acontece é:
int a = i;
i++;
i = a;

[quote=thiago.correa][quote]
The operators in this table are listed in precedence order: The closer to the top of the table an operator appears, the higher its precedence. Operators with higher precedence are evaluated before operators with relatively lower precedence.
[/quote]

A tabela mostra o ‘expr++’ e ‘expr–’ como de maior precedência e o igual como última, logo o ‘++’ tem precedência sobre o ‘=’ certo?!

Logo o resultado deveria ser 1.[/quote]

Quase!
Primeiro ele vai incrementar, mas como esse operador diz que deve retornar o valor anterior ao incremento, ele vai retornar o valor anterior (no caso 0), e vai atribuir ao i, portanto o incremento não valeu de nada. Entendeu ?

Entender eu entendi. O difícil mesmo é aceitar! Acaba sendo confuso.

[quote=chicobento][quote=thiago.correa][quote]
The operators in this table are listed in precedence order: The closer to the top of the table an operator appears, the higher its precedence. Operators with higher precedence are evaluated before operators with relatively lower precedence.
[/quote]

A tabela mostra o ‘expr++’ e ‘expr–’ como de maior precedência e o igual como última, logo o ‘++’ tem precedência sobre o ‘=’ certo?!

Logo o resultado deveria ser 1.[/quote]

Quase!
Primeiro ele vai incrementar, mas como esse operador diz que deve retornar o valor anterior ao incremento, ele vai retornar o valor anterior (no caso 0), e vai atribuir ao i, portanto o incremento não valeu de nada. Entendeu ?[/quote]

Putz…
Realmente primeiro ele soma, mas como temos um i++ (retorna o valor antes da soma)
Então:
i = i++;
é igual a
i = 1; //soma 1, pois precede ao "="
i = 0; //devolve 0, pois era o estado anterior de i

é isso mesmo?

Isso mesmo. :thumbup: