int a = 3;
a += (a++) * (a++);
D'abord construire l'arbre de syntaxe:
+=
a
*
a++
a++
Pour l'évaluation de commencer avec la plus externe de l'élément et la descente récursive. Pour chaque élément:
- Évaluer les enfants à partir de la gauche vers la droite
- Évaluer l'élément lui-même
L' +=
opérateur est spécial: Il est étendu à quelque chose comme left = left + right
, mais seulement l'évaluation de l'expression left
une fois. Toujours du côté gauche obtient évalué à une valeur(et pas seulement une variable) avant le côté droit devient évalué à une valeur.
Cela conduit à:
- Commencer à évaluer
+=
- Évaluer côté gauche de l'affectation à la variable
a
.
- Évaluer la variable
a
de la valeur 3
qui sera utilisé dans l'addition.
- Commencer à évaluer
*
- L'évaluation de la première
a++
. Ce retourne la valeur courante de 3
et définit a
de 4
- Évaluer le second
a++
. Ce retourne la valeur courante de 4
et définit a
de 5
- Calculer le produit: 3*4 = 12
- Exécuter
+=
. Le côté gauche a été évaluée à l' 3
dans la troisième étape, et le côté droit est - 12
. Donc, il assigne 3+12=15 a
.
- La valeur finale de l'
a
est de 15.
Une chose à noter ici est que la priorité de l'opérateur n'a aucune influence directe sur l'ordre d'évaluation. Cela n'affecte que la forme de l'arbre, et donc indirectement de la commande. Mais entre frères et sœurs dans l'arborescence de l'évaluation est toujours de gauche à droite, que ce soit la priorité de l'opérateur.