Short :
Cela est dû à la préséance des opérateurs. Le premier cas est égal à celui-ci :
x = (b ? (y=1) : 2); // Compiles OK.
Alors que la seconde est :
x = (b ? 1 : y) = 2;
La première compile très bien, car une affectation est évaluée à la nouvelle valeur. Ainsi, si b
est vrai, il fera en sorte que les deux x
y y
égale à 1. La seconde revient à dire : x = 1 = 2
. Donc, oui, pour corriger cette erreur de compilation, ajoutez des parathèses à votre déclaration :
x = (b ? 1 : (y = 2)); // Outer () are not needed, but is clearer, IMHO.
Plus long :
En JLS §15.26 dit ceci :
Il y a 12 opérateurs d'affectation ; tous sont syntaxiquement droit-associatif (ils se regroupent de droite à gauche). Ainsi, a=b=c
signifie a=(b=c)
qui attribue la valeur de c
a b
puis attribue la valeur de b
a a
.
Le résultat du premier opérande d'un opérateur d'affectation. doit être une variable ou une erreur de compilation se produit. <em>(Ceci explique l'erreur de compilation à laquelle vous êtes confronté).</em>
Au moment de l'exécution, le résultat de l'expression d'affectation est la valeur de la variable après l'affectation. Le résultat d'une expression d'affectation n'est pas lui-même une variable.
La seconde n'est en effet pas valable. Considérez ceci :
x = 1 = 2; // No proper syntax! Same idea as case #2
Comme il s'agit d'une association à droite, on peut l'écrire comme suit :
x = (1 = 2);
Puisque l'affectation 1 = 2
n'est pas valable, car 1
n'est pas une variable, cela provoque une erreur de compilation.