2017-01-07 1 views
-2

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 de a?

À 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?

+1

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

+0

Il n'y a pas de point de séquence pour le dernier -> UB. – Olaf

+0

@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

Répondre

2

(c = a * b)!=(a = c + a); appelle un comportement indéfini. L'ordre d'évaluation des expressions (c = a * b) et (a = c + a) n'est pas séquencé.

C11-6.5/2:

Si un effet secondaire sur un objet scalaire est non séquencée par rapport soit à un effet secondaire différent sur le même objet scalaire ou un calcul de valeur en utilisant la valeur d'un même objet scalaire , le comportement est indéfini. [...]

la citation

l'effet secondaire (modification de l'argument gauche) de l'opérateur d'affectation directe et al l Les opérateurs d'affectation composés sont séquencés après le calcul de la valeur (mais pas les effets secondaires) des arguments gauche et droit.

signifie que pour les expressions comme a = b; ou a += b, cession de b-a est séquencée après l'évaluation des sous-expressions a et b dans les deux déclarations. Ceci est garanti par la norme C. Mais, l'ordre d'évaluation de a et b dans les déclarations ci-dessus n'est pas garanti.