2017-09-09 2 views
4

Je suis un peu confus au sujet de l'extrait de code court suivant, pourquoi le résultat n'est pas 4, mais 3?Organisation de la hiérarchie d'opérateur de '+ =' et '++'?

int i = 1; 
i += ++i; 
System.out.println(i); 

Ce que je pensais est:

  1. Calculer le côté droit, ++i, i est 2 alors;
  2. Calculer le +=, i = i + 2, à cet instant, je pensais que i devrait être 4 maintenant, mais le résultat est 3.

Répondre

10

Calculer le côté droit, ++ i

Non, ce n'est pas la première étape.

La première étape consiste à évaluer la valeur d'origine du côté gauche. Puis évaluez le côté droit. Sommez-les et affectez le résultat à la variable.

Alors

i += ++i; 

est largement équivalent à

i = i + (++i); 

En particulier, de JLS 15.26.2, Souligné par l'auteur:

  • Sinon, la valeur de la gauche l'opérande de la main est s aved puis l'opérande de droite est évalué. Si cette évaluation se termine brusquement, alors l'expression d'affectation se termine brusquement pour la même raison et aucune affectation ne se produit.

  • Sinon, la valeur enregistrée de la variable à la main gauche et la valeur de l'opérande de droite sont utilisés pour effectuer l'opération binaire indiquée par l'opérateur d'affectation composé. Si cette opération se termine brutalement, l'expression d'affectation se termine brutalement pour la même raison et aucune affectation ne se produit.

+0

Je pense que l'opérateur ++ a une priorité plus élevée que + =, pourquoi l'opération ++ ne se fait pas en premier? –

+2

@WenhuCao: La préséance concerne le regroupement. C'est la précédence qui signifie que 'a + b * c' est traité comme' a + (b * c) 'plutôt que' (a + b) * c' - mais 'a' serait encore évalué en premier. –

+0

OK, laissez-moi digérer pendant un moment ... Merci beaucoup de toute façon :) –

5

Le Evaluation Order est aussi:

i += ++i; 

=> i = i + ++i; 
=> i = 1 + ++i; 
=> i = 1 + 2; 

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