Y a-t-il un sharepoint séquence entre ces assignations?

Y at-il un sharepoint séquence entre les deux assignations dans le code suivant:

f(f(x=1,1),x=2); 

La citation pertinente du (projet de) norme [6.5.2.2, 10] est:

L’ordre d’évaluation du désignateur de fonction, des arguments réels et des sous-expressions dans les arguments réels n’est pas spécifié, mais il existe un sharepoint séquence avant l’appel réel.

Donc, pour votre expression, le premier argument (en particulier l’appel à f ) pourrait être évalué avant le deuxième argument; par exemple:

 (x = 1, 1), f  call, (x = 2), f  call 

Ou bien, il pourrait être évalué après le deuxième argument. par exemple:

 (x = 2), (x = 1, 1), f  call, f  call 

[L’appel de fonction lui-même peut contenir (et le plus probablement le fera probablement) davantage de points de séquence (en particulier s’il contient une instruction return ).]

En fonction de cela, il y a un sharepoint séquence entre les assignations ou non. C’est à la plate-forme (“non spécifié”).

Étant donné que dans le deuxième cas, vous atsortingbuez deux fois à x entre deux points de séquence, vous avez un comportement indéfini sur une telle plate-forme.

Non il n’y en a pas. La norme est en effet ambiguë dans ce cas.

Si vous voulez confirmer cela, gcc a cette option vraiment cool -Wsequence-point et dans ce cas il vous avertira que l’opération peut être indéfinie

Il y a des points de séquence au début et à la fin d’un appel de fonction. Cependant, puisque l’ordre des opérations sur les arguments de la fonction est défini par l’implémentation, vous ne pouvez pas garantir que f(x=1,1) sera exécuté avant x=2 .

Notez également que , dans le cas d’appel de fonction, l’ opérateur de virgule qui introduit un sharepoint séquence n’est pas.

Il y a un sharepoint séquence, mais l’ordre d’évaluation (et leurs effets secondaires) des arguments de la fonction externe est toujours indéfini. L’implémentation est libre d’évaluer d’abord le f interne (), avec son effet secondaire x = 1, ou le deuxième argument avec son effet secondaire x = 2.

Oui, car il y a un sharepoint séquence avant et après les appels de fonction.

Le paragraphe 1.0.17 de la norme dit:

Lors de l’appel d’une fonction (qu’elle soit ou non en ligne), il existe un sharepoint séquence après l’évaluation de tous les arguments de la fonction (le cas échéant) qui a lieu avant l’exécution d’une quelconque expression ou instruction dans le corps de la fonction. Il existe également un sharepoint séquence après la copie d’une valeur renvoyée et avant l’exécution d’expressions en dehors de la fonction).

Oui, il y aura un sharepoint séquence en raison d’une virgule operatror, ​​mais le résultat restra non défini car l’évaluation des arguments de la fonction est indéfinie. Il est donc impossible de prédire quelle valeur cette expression générera