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;
thiago.correa
Estranho a atribuição ter precedência na adição! Essa expressão não teria o mesmo efeito de i = i +1???
sergiolpf
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.
danieldestro
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.
sergiolpf
vc tem que ver que o (++) e o (–) são operadores unários a precedencia é outra.
T
thingol
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”.
thiago.correa
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;
O Daniel, porque ele atribui e depois soma???! Se fosse o inverso ( i = ++i ) ele retornaria um!
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.
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.
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 ?
thiago.correa
Entender eu entendi. O difícil mesmo é aceitar! Acaba sendo confuso.
eltonk
chicobento:
thiago.correa:
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.
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.
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 ?