2011-12-04 50 views
24

¿Por qué la salida en este ejemplo es ?Arrays de Java: ¿por qué la salida es '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] ]); 
} 

pensé que sería . es decir, la expresión se evalúa como:

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

No debería a [0] ser porque un está apuntando a b?

Gracias de antemano.

+3

¡Hombre, C tiene esto mucho más simple con ese "comportamiento indefinido"! – Kos

+2

+1 para aprendizajes extraños! –

+1

Este es el tipo de preguntas que a algunos especialistas en pruebas o entrevistas de Java les encantaría hacer, aunque nadie que esté en lo cierto escribiría códigos como ese. – GreenieMeanie

Respuesta

16

Eso me weirded así ... Sin embargo, consulte la sección 15.7.1 sobre here

Esencialmente, los operandos se evalúan de izquierda a derecha. Pero también tenga en cuenta esto:

Se recomienda que el código no dependa fundamentalmente de esta especificación. El código suele ser más claro cuando cada expresión contiene como máximo un efecto lateral, como su operación más externa, y cuando el código no depende exactamente de qué excepción surge como consecuencia de la evaluación de expresiones de izquierda a derecha.

+1

Siempre pensé que los brackets se evalúan primero - BODMAS – ziggy

26

Los argumentos para cada operador se evalúan de izquierda a derecha. Es decir, el a delante del [...] se evalúa antes que su contenido, en cuyo punto todavía se refiere al primer conjunto.

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

se interpreta de la siguiente manera:

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

Aquí está el truco: se evalúa a como el valor antes de b es asignado a la misma.

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

Piensa en la precedencia del operador en Java. Debería ser un poco más obvio.

+0

-1: el OP preguntó por qué, acaba de mostrar que es posible obtener 1 cuando reordena instrucciones ... – Betlista

2

Como Mr Marcelo Cantos señalado, los argumentos para cada operador se evalúan de izquierda a derecha. Por lo tanto esto es lo que creo que la ejecución es

a[(a=b)[3]] 

Aquí el exterior 'a' se ha podido recuperar la "1,2,3,4" y luego su argumento (a = b) [3] se evalúa. Por lo tanto, ahora se devuelve a = b y el elemento en el índice 3 en b matriz, que también está apuntado por a.

Por lo tanto obtenemos un '0' de la evaluación del argumento. Como se dijo anteriormente, la palabra a externa todavía se refiere a los contenidos antiguos. Así se obtiene una matriz [0] en 1,2,3,4.

Por lo tanto, obtenemos un '1'.

Esto es lo que tengo entendido. Por favor, avíseme si está mal.

Gracias,