J'ai eu une question dans mon test qui m'a confus (code ci-dessous). Pour le dire brièvement, je pensais que les variables sont réaffectées puis ajoutées en tant que valeur à l'expression (rendant la sortie "8, 10") mais semble que la valeur d'origine ne soit pas modifiée. Qu'est-ce que je rate?

P.s. Désolé si une question similaire existe, je n'ai pas pu en trouver (probablement c'est trop évident: P).

class InitTest{
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        a += (a = 4);
        b = b + (b = 5);
        System.out.println(a + ",  " + b);
    }
}
0
Artur Shalimov 2 sept. 2020 à 03:05

2 réponses

Meilleure réponse
a += (a = 4);

Ce qui précède est logiquement équivalent à ce qui suit:

a = a + (a = 4);

Si nous substituons dans la valeur existante a, cela se simplifie en:

a = 10 + 4 = 14

Nous pouvons faire de même pour b:

b = b + (b = 5) = 20 + 5 = 25

Nous voyons ce résultat en raison de la priorité des opérateurs. L'opérateur d'addition, +, a une priorité plus élevée que l'opérateur d'affectation, =, tel que défini par Java table de priorité des opérateurs.

Vous pouvez voir que l'opérateur d'affectation d'addition, +=, partage la même priorité que l'opérateur d'affectation, auquel cas l'expression est évaluée de gauche à droite.


Si, à la place, les expressions étaient:

a = (a = 4) + a;
b = (b = 5) + b;

Ensuite, il en résulterait la sortie que vous attendez (a = 8, b = 10), car l'opérande gauche est calculé avant l'opérande droit (lors de l'évaluation de l'expression). Je vais essayer de localiser où cela est spécifié dans la spécification du langage Java.

1
Jacob G. 2 sept. 2020 à 00:35

En Java, lors de l'affectation d'une valeur à une variable, la première chose qui est calculée est la partie gauche du signe =, puis la droite. Par conséquent, lorsque vous écrivez a += (a = 4); qui est équivalent à a = a + (a=4) qui est le même que a = a + 4, idem pour b.

-1
Kostas Konnidis 2 sept. 2020 à 00:14