Techniquement, dans l'ensemble, il s'agit d'un comportement indéfini .
Mais, il y a deux aspects importants à la réponse.
L'instruction de code:
std::cout << a++ << a;
est évalué comme:
std::operator<<(std::operator<<(std::cout, a++), a);
La norme ne définit pas l'ordre d'évaluation des arguments d'une fonction.
Donc soit:
std::operator<<(std::cout, a++)
est évalué en premier ou
a
est évalué en premier ou
- il peut s'agir de n'importe quel ordre défini par l'implémentation.
Cette commande n'est pas spécifiée [Ref 1] selon la norme.
[Ref 1] C ++ 03 5.2.2 Appel de fonction
Para 8
L'ordre d'évaluation des arguments n'est pas spécifié . Tous les effets secondaires des évaluations d'expressions d'argument prennent effet avant que la fonction ne soit entrée. L'ordre d'évaluation de l'expression postfix et de la liste des expressions d'argument n'est pas spécifié.
De plus, il n'y a pas de point de séquence entre l'évaluation des arguments d'une fonction mais un point de séquence n'existe qu'après évaluation de tous les arguments [Ref 2] .
[Ref 2] C ++ 03 1.9 Exécution du programme [intro.execution]:
Para 17:
Lors de l'appel d'une fonction (que la fonction soit en ligne ou non), il existe un point de séquence après l'évaluation de tous les arguments de fonction (le cas échéant) qui a lieu avant l'exécution de toute expression ou instruction dans le corps de la fonction.
Notez que, ici, la valeur de c
est accédée plus d'une fois sans point de séquence intermédiaire, à ce sujet, la norme dit:
[Réf 3] C ++ 03 5 Expressions [expr]:
Para 4:
....
Entre le point de séquence précédent et suivant, un objet scalaire verra sa valeur stockée modifiée au plus une fois par l'évaluation d'une expression. De plus, la valeur précédente ne sera accessible que pour déterminer la valeur à stocker . Les exigences de ce paragraphe doivent être remplies pour chaque ordre autorisé des sous-expressions d'une expression complète; sinon, le comportement n'est pas défini .
Le code est modifié c
plus d'une fois sans point de séquence intervenant et il n'est pas accédé pour déterminer la valeur de l'objet stocké. C'est une violation flagrante de la clause ci-dessus et par conséquent, le résultat tel que prescrit par la norme est un comportement indéfini [Réf 3] .