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

11 respostas
C

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.

11 Respostas

V

Acho que é assim:

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

Letra C.

T

Eu compilei e rodei o programa acima, e deu

1,0
T

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".

V

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

G

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

C

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".

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++?

T

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.

G

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?

T

É 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.

C

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

T

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

Criado 6 de janeiro de 2009
Ultima resposta 6 de jan. de 2009
Respostas 11
Participantes 4