Ordre d'évaluation

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Expressions - Index

L'ordre dans lequel le compilateur évalue les opérandes d'une expression n'est pas spécifié, sauf lorsqu'un opérateur l'énonce explicitement. Le compilateur essaie de réordonner l'expression afin d'améliorer la qualité du code généré. Vous devez donc être attentif aux expressions où une valeur est modifiée plusieurs fois. En général, évitez d'écrire des expressions qui modifient et utilisent la valeur du même objet. Par exemple, soit l'expression :



 i = v[i++];  // i est non défini



La valeur de i est différente selon que i est incrémenté avant ou après l'affectation. De même :



 int total = 0;
 somme = (total = 3) + (++total); // somme = 4 ou somme = 7 ??



est ambiguë pour somme et total. La solution est de reformuler l'expression en utilisant une variable temporaire :



 int temp, total = 0;
 temp = ++total;
 somme = (total = 3) + temp;



Lorsque la syntaxe met en oeuvre une séquence d'évaluation, il est plus sûr d'avoir plusieurs évaluations :



 somme = (i = 3, i++, i++); // OK: somme = 4, i = 5



Chaque sous-expression d'une expression avec virgule est évaluée de gauche à droite, et l'ensemble a pour résultat la valeur la plus à droite.

Le compilateur regroupe les expressions, en réordonnant les opérateurs associatifs et commutatifs indépendamment des parenthèses, afin de créer une expression compilée de façon optimale ; en aucun cas ce réarrangement n'affecte la valeur de l'expression.