Apesar de parecer estranho, tenho que concordar com a explicação…
Inanarrayaccess,theexpressiontotheleftofthebracketsappearstobefullyevaluatedbeforeanypartoftheexpressionwithinthebracketsisevaluated.
expressiona[(a=b)[3]],theexpressionaisfullyevaluatedbeforetheexpression(a=b)[3]; thismeansthattheoriginalvalueofaisfetchedandrememberedwhiletheexpression(a=b)[3]isevaluated.Thisarrayreferencedbytheoriginalvalueofaisthensubscriptedbyavaluethatiselement3ofanotherarray(possiblythesamearray)thatwasreferencedbybandisnowalsoreferencedbya.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
T
thingol
Isso é pegadinha, mas não deve cair em provas porque é insidiosa demais. O código acima é equivalente a:
publicclassTesteArray{publicstaticvoidmain(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
publicclassTesteArray{publicstaticvoidmain(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.
D
davidpadilha
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?
eltonk
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…
D
davidpadilha
se ele pega a posição ‘3’, pq não deu 0?
P
poiati
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.
eltonk
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.
Na realidade o item 3 é executado antes do item 2, mas o item 2 está com a referência antiga de “a”…