Ordre d’évaluation de l’expression en C

Si j’ai l’expression suivante:

c = (a) * (b) 

Que dit la norme C90 à propos de l’évaluation d’ordre de la sous-expression “a” et “b”?

Il n’y a pas d’ordre spécifié puisque l’opérateur de multiplication n’est pas un sharepoint séquence. Les points de séquence incluent l’opérateur de virgule, la fin d’une expression complète et les appels de fonction. Ainsi, l’ordre d’évaluation de (a) et (b) dépend de l’implémentation du compilateur. Par conséquent, vous ne devriez pas essayer de faire quelque chose dans (a) qui aurait un effet secondaire que vous voulez voir en (b) afin de générer un résultat valide.

Par exemple:

 int a=5; int b = (a++) * (a++); //<== Don't do this!! 

Si vous souhaitez une liste complète des points de séquence pour C, vous pouvez consulter une référence plus complète ici .

L’ordre d’évaluation des opérandes de l’opérateur binary * n’est pas spécifié dans C90.

Voici le paragraphe pertinent de la norme C90 (comme la question posée à propos de C90):

(C90, 6.3) “Sauf indication contraire dans la syntaxe ou autre indication ultérieure (pour l’opérateur de l’appel de fonction (), &&, ||,?:, Et les virgules). L’ordre d’évaluation des sous-expressions et l’ordre dans lequel les effets secondaires ont lieu sont les deux non spécifiés ”

Pour l’opérateur * , prenons un exemple avec des opérandes à effets secondaires tels que:

 c = f() * g(); 

l’implémentation peut appeler f() ou g() premier:

 a = f(); b = g(); c = a * b; 

ou

 a = g(); b = f(); c = a * b; 

Les deux sont des traductions valides.