Techniquement, globalement, c'est Comportement indéfini .
Mais, il y a deux aspects importants à la réponse.
L'énoncé du code :
std::cout<<c++<<c;
est évalué comme :
std::operator<<(std::operator<<(std::cout, c++), c);
La norme ne définit pas l'ordre d'évaluation des arguments d'une fonction.
Soit :
-
std::operator<<(std::cout, c++)
est évalué en premier ou
-
c
est évalué en premier ou
- il peut s'agir de n'importe quel ordre défini par la mise en œuvre.
Cet ordre est Non spécifié [Réf. 1] conformément à la norme.
[Réf. 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 des expressions arguments prennent effet avant l'entrée de la fonction. L'ordre d'évaluation de l'expression postfixe et de la liste des expressions d'arguments 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 l'évaluation de tous les arguments. [Réf. 2] .
[Réf. 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 y a un point de séquence après l'évaluation de tous les arguments de la 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é plus d'une fois sans point de séquence intermédiaire, la norme précise à ce sujet que
[Réf. 3] C++03 5 Expressions [expr] :
Para 4 :
....
Entre le point de séquence précédent et le suivant, la valeur stockée d'un objet scalaire doit être modifiée au maximum une fois par l'évaluation d'une expression. En outre, la valeur précédente ne doit être consultée que pour déterminer la valeur à stocker. . Les exigences du présent paragraphe doivent être satisfaites pour chaque ordre admissible des sous-expressions d'une expression entière complète ; sinon le comportement est indéfini .
Le code modifie c
plus d'une fois sans point de séquence intermédiaire et on n'y accède pas pour déterminer la valeur de l'objet stocké. Il s'agit d'une violation évidente de la clause ci-dessus et le résultat, tel qu'exigé par la norme, est le suivant Comportement indéfini [Réf. 3] .