Questão interessante

[code]public class teste{
public static void main(String argv[]){

     teste inc = new teste();
            int i =0; 
            inc.fermin(i);
            i = i++;
            System.out.println(i);
    }

    void fermin(int i){
            i++;
    }

}[/code]

Qual o resultado??

Seria 2 ?? :oops:

é 1

Acho que é 1.

Pessoal eu executei e o resultado foi… 0

Agora a explicação que é o problema…
Se considerar que no Java a passagem de parametro do tipo primitivo é por valor, acredito que o retorno deveria ser 2, agora acredito que o jeito como o código está escrito algo de errado ocorre na máquina virtual que a linha com o comando “i = i++;” não funciona dentro do método main.
Peço que se alguem souber o que aconteceu na máquina virtual explique para gente…

Um Abraço

Darcy

Existem dois pontos nessa questao:

O primeiro é a precedencia dos operadores (nao sei exatamente o termo correto) mas se colocarmos:

     i = ++i;

O resultado passa a ser um, agora a questão pela qual o resultado nao é dois eu nao descobri…

Ate mais !!!

Também vou de 1.

A Paz!!

bahhhhhhhhhhhh realmente me precipitei!!! antes de ele somar 1 no i++ ele faz a atribuição… então, antes do i++, o valor ainda é zero, sendo assim, imprime zero… :oops:

Putz que mancada a minha tb …

:oops: :oops: :oops: :oops:

Eu entendi a explicação de vocês… Agora uma questão que parece não ter cido levada em conta é que no java quando passamos um parametro do tipo primitivo, teóricamente, este parametro é passado por valor e não por referência. Se esta afirmação está correta o valor a variável i antes da linha com o comando “i = i++;” deveria ser iqual a 1 devido ao metodo na linha anterior que modifica o valor desta variável. Alguem sabe me esplicar onde eu estou errando na minha explicação?

Desculpe pessoal.
Agora entendi…
O parametro i foi passado por valor, sendo assim não importa o que o método fassa com o valor recebido… não afetará a variável i no método main. E depois quando executa a linha “i = i++” primeiro ele atribui o valor de i, que é zero, para a variável i e depois ele faria o acrescimo de 1 na variável i que não é feito devido a…
Não sei bem mas arrisco a chutar que o fato de i ter sofrido uma atualização para o valor zero a referencia na memória mudou e por isto a variável i não foi afetada pelo comando "i++"
Alguem sabe dar uma explicação mais convincente??? :slight_smile:

Darcy

Eu tb tinha boiado rsrs

:oops:

Massa!!!
Essa questão tenta desviar o foco pra passagens de parâmetros,
quando na verdade o grande detalhe está
em

onde primeiro ele atribui o valor de i no próprio i, e depois incrementa,
só que o incremento é descartado,pois i já foi atribuído.

esse tipo de incremento eu já vi em algum outro post , mas foi o foco
da questão nessa ele tenta te enganar … hahahaha… normal na prova…

Fábio,

As atribuições têm a última precedência!

O que acontece é que o incremento pós-fixado (i++) somente é executado após o operando ser avaliado assumindo o valor zero. Depois o i assume o valor 1, devido ao incremento. E finalmente, o zero que havia sido armazenado no operando é atribuido ao i, substituindo o 1 assumido pelo incremento.

Espero não ter compicado muito!!!:wink:

é … não consegui explicar direito , mas sabia o resultado… hhehe…
acho q foi por já ter visto e não ter visto a explicação…

Ex.:

      int i = 0;
      int j = 0;
      int k = 0;
      int z = 0;
      i = i+++j+++k++;

Então nesse caso, i será igual a zero… porque ele vai indo incrementando
pos fixadamente as variaveis e por último atribui o valor a i

Java não suporta passagem por referencia, somente por valor.
http://javadude.com/articles/passbyvalue.htm

A explicação pra este resultado é o fato da precedencia de operadores.

No caso x = ++x, primeiro o x é incrementado e depois atribuido ao proprio x.

No caso x = x++ primeiro o x é atribuido ao próprio x e depois é incrementado, mas o valor incremetado fica no vazio, ninguém recebe este valor, por isso imprime 0.