2011-12-04 9 views
24

Perché l'output in questo esempio è ?Array Java - Perché l'output '1'?

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] ]); 
} 

ho pensato che sarebbe stato . cioè, l'espressione viene valutata come:

a[(a=b)[3]] 
a[b[3]] //because a is now pointing to b 
a[0] 

Non dovrebbe un [0] essere perché un sta indicando b?

Grazie in anticipo.

+3

Man, C ha questo molto più semplice con quella cosa "comportamento indefinito"! – Kos

+2

+1 per strani apprendimenti! –

+1

Questi sono il tipo di domande che alcuni test Java o gli intervistatori vorrebbero chiedere, anche se nessuno che sia sano mai scriverebbe un codice del genere. – GreenieMeanie

risposta

16

Questo mi weirded fuori pure ... però, controlla la sezione 15.7.1 oltre here

In sostanza, gli operandi vengono valutati da sinistra a destra. Nota anche questo:

Si consiglia di non basare il codice su queste specifiche. Il codice è in genere più chiaro quando ciascuna espressione contiene al massimo un effetto collaterale, come la sua operazione più esterna, e quando il codice non dipende esattamente da quale eccezione si presenta come conseguenza della valutazione delle espressioni da sinistra a destra.

+1

Ho sempre pensato che le parentesi siano valutate per prime: BODMAS – ziggy

26

Gli argomenti per ciascun operatore vengono valutati da sinistra a destra. Ad esempio, lo [...] davanti allo [...] viene valutato prima del suo contenuto, a quel punto si riferisce ancora al primo array.

7
a [ (a = b)[3] ]) 

viene interpretato come segue:

a = b => a = {2, 3, 1, 0}; 
(a = b)[3] => 0; 

Ecco il trucco: a viene valutato come il valore prima b viene assegnato ad esso.

a[(a = b)[3]) => a[0] = 1; 

Pensa alla precedenza degli operatori in Java. Dovrebbe essere un po 'più ovvio.

+0

-1: l'OP ha chiesto perché, hai appena mostrato che è possibile ottenere 1 quando si riordinano le istruzioni ... – Betlista

2

Come ha sottolineato Marcelo Cantos, gli argomenti relativi a ciascun operatore vengono valutati da sinistra a destra. Perciò ecco cosa penso l'esecuzione è

a[(a=b)[3]] 

Qui l'esterno 'un' scaricherà "1,2,3,4" e quindi il suo argomento (a = b) [3] è valutata. Così ora a = b viene restituito l'elemento nell'indice 3 nell'array b che è anche indicato da a.

Quindi otteniamo uno "0" dalla valutazione dell'argomento. Come detto in precedenza, l'esterno a si riferisce ancora ai vecchi contenuti. Così dà un [0] in una matrice 1,2,3,4.

Quindi otteniamo un '1'.

Questa è la mia comprensione. Per favore fatemi sapere se è sbagliato.

Grazie,