Voici le problème:L'opérateur relationnel en C a-t-il un ordre d'évaluation fixe?
Avec
int a,b,c;
, est équivalent àa = a * b + a;
(c = a * b)!=(a = c + a);
par rapport à la modification dea
?
À première vue, je pense qu'ils sont les mêmes, mais ne puis dire que la spécification dans expr1 != expr2
, expr1
sera toujours évaluée avant expr2
? Je pense que ce n'est pas le cas mais je ne trouve pas de source définitive à ce sujet.
Aussi, je suis déconcerté par la ce que je trouve dans http://en.cppreference.com/w/c/language/eval_order:
L'effet secondaire (modification de l'argument gauche) de l'opérateur d'affectation directe et de tous les opérateurs d'affectation de composé est séquencée après la valeur calcul (mais pas les effets secondaires) des deux arguments gauche et droit.
(depuis C11)
Est-ce que cela signifie que je peux l'interpréter comme depuis C11 la déclaration ci-dessus aura l'ordre d'évaluation fixe (depuis la cession est impliqué), mais pas pré-C11?
Pas très en phase avec les normes, mais AFAICT la partie "depuis C11" fait référence à la formulation "séquencée après"; Les normes antérieures utilisaient un concept de "points de séquence" qui n'est plus utilisé. Moralement, il ne devrait pas y avoir de grande différence entre les deux énoncés de C99 et C11; Les mises à niveau de normes, particulièrement dans le cas des langages C et C++, ne cassent pas vraiment le code existant conforme aux anciennes normes à de rares exceptions près. – Cubic
Il n'y a pas de point de séquence pour le dernier -> UB. – Olaf
@Cubic: Alors pourquoi la norme mentionne-t-elle des points de séquence partout dans le texte et fournit même une annexe avec les points de séquence? Ils n'ont pas changé cela, voulez-vous dire le langage ** différent ** C++?"séquencé après" n'est pas le même en C que les points de séquence. – Olaf