Question

Quels sont l'ordre des opérations lors de l'utilisation de deux opérateurs d'affectation en une seule ligne?

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

Edit: Merci pour les messages. J'obtiens cela = prend des valeurs de la droite, mais quand je compile cela, j'obtiens:

9 9 6

Je pensais que cela aurait été et une exception de bourse de fin avant de Il se déplace sur le 9. Est-ce que cela fait ça pour les tableaux?

Était-ce utile?

La solution

= est analysé comme associatif droit, mais l'ordre d'évaluation est de gauche à droite.

Donc: la déclaration est analysée comme a[i] = (i = 9). Cependant, l'expression i dans a[i] est évalué avant le côté droit (i = 9), lorsque i est toujours 0.

C'est l'équivalent de quelque chose comme:

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

Autres conseils

Selon les spécifications:

15.26 Opérateurs d'affectation Il y a 12 opérateurs d'affectation; Tous sont syntaxiquement associés à droite (ils se regroupent droit à gauche). Ainsi, a = b = c signifie a = (b = c), qui attribue la valeur de C à B puis attribue la valeur de B à A.

Alors, a[i] = i = 9; est le même que i = 9; a[i] = i;

Éditer

En fait, ce n'est pas le cas. Exemple de classe de test:

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

Exemple de course:

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

Prière de se référer à L'autre réponse pour plus d'informations. Fondamentalement:

  • a[i] = i = 9 est le même que a[i] = (i = 9), comme = Est-ce que la droite est sociale
  • Cependant, opérande L'évaluation est laissée à droite, selon cette:

    15.7. Ordonnance d'évaluation

    Le langage de programmation Java garantit que les opérandes d'opérateurs semblent être évalués dans un ordre d'évaluation spécifique, à savoir de gauche à droite.

    Il est recommandé que le code ne s'appuie pas de manière cruciale sur cette spécification. Le code est généralement plus clair lorsque chaque expression contient au plus un effet secondaire, comme son fonctionnement le plus externe, et lorsque le code ne dépend pas exactement de cette exception en raison de l'évaluation de gauche à droite des expressions.

J'ai copié le deuxième paragraphe qui est très instructif ici - il est rarement logique d'écrire du code déroutant comme ça.

Je trouve aussi cette vaut la peine d'être vérifié.

Si je me souviens bien, = l'opérateur est à droite; Je serai donc attribué d'abord, puis un [i].

La = L'opérateur est le droit associatif (comme d'autres l'ont déjà dit). Cela peut être facilement prouvé avec ce test:

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

Cela fonctionne avec tous les types, objets et primitives.

La façon dont j'ai entendu ceci mentionné est "double affectation", car, en utilisant l'exemple ci-dessus, vous attribuez la valeur de j aux deux i et x.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top