Questão de Arrays

Vejamos o código:

public class TesteArray {
	   public static void main(String[ ] args)
	   {
	      int[] a = { 1, 2, 3, 4 };
	      int[] b = { 2, 3, 1, 0 };
	      System.out.println( a [ (a = b)[3] ] );
	   }
	}

No meu conceito, a saída deveria ser 2, alguém pode me explicar por que a saída não é essa?! :shock:

[]s

Apesar de parecer estranho, tenho que concordar com a explicação…

In an array access, the expression to the left of the brackets appears to be fully evaluated
 before any part of the expression within the brackets is evaluated.
expression a[(a=b)[3]], the expression a is fully evaluated before the expression (a=b)[3]; 
this means that the original value of a is fetched and remembered while the expression 
(a=b)[3] is evaluated. This array referenced by the original value of a is then subscripted by 
a value that is element 3 of another array (possibly the same array) that was referenced by 
b and is now also referenced by a. So, it's actually a[0] = 1.
Note that, if evaluation of the expression to the left of the brackets completes abruptly, no 
part of the expression within the brackets will appear to have been evaluated.

[]s

Isso é pegadinha, mas não deve cair em provas porque é insidiosa demais. O código acima é equivalente a:

public class TesteArray {
    public static void main(String[ ] args)
    {
        int[] a = { 1, 2, 3, 4 };
        int[] b = { 2, 3, 1, 0 };

        //System.out.println( a [ (a = b)[3] ] );
        System.out.println (a [b [3]]);
        a = b;
    }
}

não

public class TesteArray {
    public static void main(String[ ] args)
    {
        int[] a = { 1, 2, 3, 4 };
        int[] b = { 2, 3, 1, 0 };

        //System.out.println( a [ (a = b)[3] ] );
        a = b;
        System.out.println (a [a [3]]);
    }
}

como você tinha pensado.

Ainda não entendi o pq de chegar no resultado = 1

Alguém pode me explicar? … O que aquele [3] do lado de fora faz se não for a posição do array?

Na execução do println, ele recupera o objeto A (referência) e só então vai executar as istruçõe de dentro do Array a[].
Imagine que a linha diga isso ao compilador:
Escreva na Tela algum valor que está no Objeto que a variável “a” referencia. Mas a posição que deve ser exibida é a posição “3”. Mas antes disso ainda mude a referência da variável “a” para “b”.

Antes da variável “a” mudar a referência para “b”, a referência do objeto “a” já foi passada para o println que é daí que o cara pega os valores…

se ele pega a posição ‘3’, pq não deu 0?

Ele faz o seguinte:

1 - println(a[b[3]]) // Como b[3] = 0 fica: println(a[0]) e a[0] é = 1 certo ?

2 - Ele da um print em a[0] na tela que é 1.

3 - Ele muda a referência “a” para apontar para o Objeto que a referência “b” esta apontando.

Ele faz o seguinte:

1 - println(a[b[3]]) // Como b[3] = 0 fica: println(a[0]) e a[0] é = 1 certo ?

2 - Ele da um print em a[0] na tela que é 1.

3 - Ele muda a referência “a” para apontar para o Objeto que a referência “b” esta apontando.
[/quote]

Na realidade o item 3 é executado antes do item 2, mas o item 2 está com a referência antiga de “a”…