Préséance et associativité des opérateurs en C

Veuillez regarder l’extrait de code suivant:

int a = 10, b; b = (a) + (++a); //2 printf("b = %d\n", b); 

Sortie:

 b = 22 

Dans la déclaration 2, il y a 4 opérateurs distincts. Parmi lesquels () a la priorité la plus élevée. L’associativité de l’opérateur () étant de gauche à droite, pourquoi b = 22 et non 21 ?

 $ gcc --version gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 

 b = (a) + (++a); 

Cela a un comportement indéfini.

Citant le standard C99 (en fait le projet de N1256 ), 6.5p2:

Entre le sharepoint séquence précédent et le suivant, la valeur stockée d’un object doit être modifiée au plus une fois par l’évaluation d’une expression. De plus, la valeur antérieure doit être lue uniquement pour déterminer la valeur à stocker.

Cette expression lit à la fois la valeur de a et la met à jour, et l’opération de lecture (le LHS du + ) n’est pas utilisée pour déterminer la valeur à stocker par l’opération d’écriture (le RHS du + ).

La norme ISO C 2011 (citant le projet de loi N1570 ) le dit différemment, mais avec essentiellement le même sens:

Si un effet secondaire sur un object scalaire n’est pas séquencé par rapport à un effet secondaire différent sur le même object scalaire ou à un calcul de valeur utilisant la valeur du même object scalaire, le comportement est indéfini. S’il existe plusieurs classements autorisés des sous-expressions d’une expression, le comportement n’est pas défini si un tel effet secondaire non séquencé se produit dans l’un des classements.

(a) est un calcul de valeur utilisant la valeur de a ; (a++) est un effet secondaire sur a . L’ordre d’évaluation des opérandes de + n’étant pas précisé, ces deux opérations ne sont pas séquencées l’une par rapport à l’autre.

Il ne s’agit donc pas simplement que l’ordre d’évaluation soit indéfini – le comportement est indéfini et ne se limite pas aux possibilités des opérandes de l’opérateur + cours d’évaluation dans l’un des deux ordres possibles.

Et non, les parenthèses ne changent pas cela.

La section 3 de la FAQ comp.lang.c explique bien cela.

L’ordre d’évaluation de + n’est pas spécifié.