Pregunta

¿Cuáles son el orden de las operaciones cuando se utilizan dos operadores de asignación en una sola línea?

public static void main(String[] args){
    int i = 0;
    int[] a = {3, 6};
    a[i] = i = 9; // this line in particular
    System.out.println(i + " " + a[0] + " " + a[1]);
}

Editar:Gracias por los mensajes.Tengo que = toma valores desde la derecha, pero al compilar esta obtengo:

9 9 6

Pensé que habría sido y ArrayOutOfBounds excepción, pero es la asignación de " un[i]' antes de es que se mueve sobre las 9.Simplemente tiene que hacer que para las matrices?

¿Fue útil?

Solución

= se analiza como derecho asociativo, pero el fin de la evaluación es de izquierda a derecha.

Así:La declaración se analiza como a[i] = (i = 9).Sin embargo, la expresión i en a[i] se evalúa antes que la derecha (en lai = 9), cuando i es todavía 0.

Es el equivalente a algo así como:

int[] #0 = a;
int #1 = i;
int #2 = 9;
i = #2;
#0[#1] = #2;

Otros consejos

según las especificaciones:

  • http://docs.oracle.com /javase/specs/jls/SE5.0/HTML/EXPRESIONS.HTML

    15.26 Operadores de asignación Hay 12 operadores de asignación; Todos son sintácticamente asociativos a la derecha (se agrupan de derecha a izquierda). Por lo tanto, A= B= C significa A= (B= C), que asigna el valor de C a B y luego asigna el valor de B a a.

    Por lo tanto, a[i] = i = 9; es el mismo que i = 9; a[i] = i;

    editar

    En realidad, ese no es el caso. Clase de prueba de muestra:

    import java.util.Arrays;
    
    public class Mkt {
      public static void main(String[] args) {
        int[] a = new int[10];
        int i = 5;
        a[i] = i = 9;
    
        System.out.println(Arrays.toString(a));
      }
    }
    

    Ejecución de muestra:

    $ javac Mkt.java && java Mkt
    [0, 0, 0, 0, 0, 9, 0, 0, 0, 0]
    

    Consulte la otra respuesta para obtener más información. Básicamente:

    • a[i] = i = 9 es lo mismo que a[i] = (i = 9), ya que = es la asociación derecha
    • Sin embargo, operando La evaluación es de izquierda a derecha, según este :

      15.7. Orden de evaluación

      El lenguaje de programación Java garantiza que los operadores de operadores parecen evaluarse en un orden de evaluación específico, a saber, de izquierda a derecha.

      Se recomienda que el código no se confíe de manera crucial en esta especificación. El código generalmente es más claro cuando cada expresión contiene como máximo 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 expresiones de izquierda a derecha.

      Copié el segundo párrafo que es muy instructivo aquí: rara vez tiene sentido escribir un código confuso como ese.

      También encuentro este vale la pena revisar .

Si recuerdo correctamente,= el operador es la asociación correcta;Así que seré asignado primero, luego un [i].

El = operador de derecho asociativo(como otros ya han dicho).Esto puede ser fácilmente demostrado con esta prueba:

int i = 2;
int j = 3;
int x = i = j;
System.out.println(x); // This prints out 3.

Esto funciona con todos los tipos de Objetos y primitivas.

De la manera que he escuchado de que esto se refiere a una "doble tarea", ya que, usando el ejemplo anterior, se asigna el valor de j a ambos i y x.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top