52 votes

En Java, qui est exécuté en premier, "+" ou "++"?

J'ai essayé le code suivant en Java

 t1 = 5;
t2 = t1 + (++t1);
System.out.println (t2);
 

Mon point de vue est depuis que ++ a une priorité plus élevée que +, ce qui précède devient

 t2 = t1 + (++t1);
t2 = t1 + 6;      // t1 becomes 6 here
t2 = 6 + 6;
t2 = 12;
 

Cependant, je reçois la réponse 11 pour t2. Quelqu'un peut-il expliquer?

76voto

Tim B Points 19851

Vous êtes près correct, mais vous êtes subtilement mal à comprendre les règles de priorité.

Comparer ces deux cas:

int t1 = 5;
int t2 = t1 + (++t1);
System.out.println (t2);

t1 = 5;
t2 = (++t1) + t1;
System.out.println (t2);

Le résultat est:

11
12

La priorité ne disent en effet d'évaluer l' ++ avant l' +, mais qui ne s'applique pas, jusqu'à ce qu'il atteigne la partie de l'expression.

Votre expression est de la forme X + YX est t1 et Y est (++t1)

La branche gauche, c'est à dire X, est évalué en premier. Ensuite la branche de droite, c'est à dire Y, est évaluée. Seulement quand il s'agit d'évaluer Y le ++ opération est effectuée.

Les règles de priorité seulement dire que l' ++ est "l'intérieur" de la Y d'expression, ils ne disent rien à propos de l'ordre des opérations.

55voto

Chris K Points 5756

Votre logique est proche, mais pas tout à fait droit. L'ordre d'évaluation est de Gauche à Droite pour l'opérateur+. t1 vient avant le binaire op, LHS, puis l'incrément est sur le membre de droite de cette binaire op. La LHS est exécuté en premier.

t2 = t1 + (++t1);
t2 = 5 + 6;      // t1 becomes 6 here as a side effect before being read on the RHS
t2 = 11;

Visualisé comme un arbre, vous avez,

    +
  /   \
 t1   ++t1

Ordre De Priorité

Lorsque deux opérateurs de partager un opérande de l'opérateur avec la plus grande priorité va d'abord. Par exemple, 1 + 2 * 3 est traité comme 1 + (2 * 3), considérant que 1 * 2 + 3 est considérée comme (1 * 2) + 3 depuis la multiplication a une priorité plus élevée que l'addition.

L'associativité

Lorsque deux opérateurs de même priorité, l'expression est évaluée en fonction de son associativité. Par exemple x = y = z = 17 est traitée comme x = (y = (z = 17)), en laissant tous les trois variables avec la valeur 17, puisque l'opérateur = de droite à gauche associativité (et une instruction d'affectation est évaluée à la valeur sur le côté droit). D'autre part, 72 / 2 / 3 est considérée comme (72 / 2) / 3 puisque l'opérateur / a gauche-à-droite de l'associativité.

15voto

JWiley Points 1744

Une autre façon de penser consiste à développer l'expression ++:

++t1 équivaut à mettre t1 = t1 + 1 .

 1) t1 = 5;
2) t2 = t1 + (++t1); 
3) t2 = t1 + (t1 = t1 + 1), 
4) t2 = 5 + (t1 = t1 + 1)
5) t2 = 5 + (t1 = 6)
6) t2 = 5 + 6 = 11
 

Si vous deviez inverser la commande en t2 = (++t1) + t1; , l'expression serait étendue à:

 1) t2 = (t1 = t1 + 1) + t1     
2) t2 = (t1 = 5 + 1) + t1
3) t2 = (t1 = 6) + t1
4) t2 = 6 + 6 = 12
 

5voto

subham soni Points 205

Pour ajouter un point à Chris K,

L'associativité est de gauche à droite

Alors,

 t2 = t1 + (++t1);
t2 = 5 + 6;      // first t1 is replaced with 5 and then the next 6 
t2 = 11;
 

3voto

icza Points 3857

Le + est évalué de gauche à droite, donc

 t1 + (++t1)     // Left side is evaluated to 5, right side evaluated to 6...
5  + (6)        // ...and as a side effect t1 becomes 6
 

Résultats en 11 .

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: