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++;
}
}
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.
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.
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”.
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 ?
[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