Qual a saída deste programa

17 respostas
adriano.ferranti

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++;
        }
}

17 Respostas

thiago.correa

1

adriano.ferranti

Errado… Alguém mais se habilita?

Luiz-SP

0

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;

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

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!

danieldestro

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

thiago.correa

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.

C
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;
C

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 ?

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 ?

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?

C

Isso mesmo. :thumbup:

Criado 7 de abril de 2006
Ultima resposta 20 de abr. de 2006
Respostas 17
Participantes 8