27 votes

Opérateur ternaire, erreur de syntaxe lors de l'utilisation de l'affectation

Les 3 lignes de code suivantes compilent correctement. (Veuillez noter que ce code est un exemple de "codage Java artificiel", et par conséquent ne serait pas vu dans du code écrit professionnellement).

int x, y;
boolean b=true;

x = b ? y=1 : 2;  // Compiles OK.

Si je modifie maintenant le code de la ligne 3 ci-dessus, pour qu'il ressemble à la ligne de code suivante, le compilateur génère une erreur.

// Change the position of the "y assignment", and now the code doesn't compile.
x = b ? 1 : y=2;  

Voici le message d'erreur syntaxique :

Ternary operator syntax error

Quelqu'un peut-il expliquer ce comportement (à un débutant en Java) ? Merci.

35voto

Martijn Courteaux Points 33836

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.

4voto

helb Points 2511

Voir "Précédence des opérateurs Java". En attendant, utilisez :

x = (b ? 1 : (y=2));

3voto

Satheesh Cheveri Points 1917

La précédence des opérateurs Java est la suivante

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

aquí ternary vient avant assignment Votre déclaration sera donc la suivante

x= ( évaluation ternaire )= valeur d'affectation

si vous voulez toujours définir la valeur de y , lorsque b est faux, vous pouvez utiliser () pour 'y=2' fait entrer dans l'évaluation ternaire.

x = b ? 1 : (y=2);

2voto

Mon frère, essaie de mettre les expressions entre parenthèses.

X= (b ? 1 : (y=2)) ;

cela fonctionnera très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X