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.
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".
[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:
Vamos obter o valor de i++.
Vamos obter o valor de m(i).
Vamos obter o resultado da soma de i++ com m(i).
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.
É 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.