java arrays scjp ocpjp

Arrays de Java-¿Por qué es la salida ''1''?



scjp ocpjp (4)

¿Por qué es la salida en este ejemplo 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 2 . 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 ser un [0] 2 porque a está apuntando a b ?

Gracias por adelantado.


Como el Sr. Marcelo Cantos señaló, los argumentos a cada operador se evalúan de izquierda a derecha. Por eso aquí está lo que creo que es la ejecución.

a[(a=b)[3]]

Aquí la ''a'' externa buscará "1,2,3,4" y luego se evaluará su argumento (a = b) [3]. Por lo tanto, ahora a = b y el elemento en el índice 3 en la matriz b se devuelve, que también es señalado por a.

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

Por lo tanto obtenemos un ''1''.

Este es mi entendimiento. Por favor, hágamelo saber si está mal.

Gracias,


Eso también me desconcertó ... verifique la sección 15.7.1 here

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

Se recomienda que el código no se base fundamentalmente en esta especificación. El código suele ser más claro cuando cada expresión contiene a lo sumo un efecto secundario, 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 izquierda a derecha de las expresiones.


Los argumentos de cada operador se evalúan de izquierda a derecha. Es decir, la a delante de [...] se evalúa antes de su contenido, momento en el que aún se refiere a la primera matriz.


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 aquí: a se evalúa como el valor antes de que se le asigne b .

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

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