Maison >développement back-end >C++ >Quel est le résultat de 'cout

Quel est le résultat de 'cout

DDD
DDDoriginal
2024-12-09 16:39:10865parcourir

What is the Output of

L'énigme du « cout << a << a » : démasquer un comportement non défini

Une question d'entretien déroutante a récemment été déclenchée un débat : quel est le résultat correct de la déclaration suivante ?

int a = 0;
cout << a++ << a;

Certains candidats sélectionnés en toute confiance "01", tandis que d'autres pensaient que le comportement n'était pas défini - une réponse qui en a d'abord surpris certains.

Le nœud du problème réside dans l'ordre d'évaluation et les effets secondaires de la déclaration. Pour comprendre cela, développons-le dans son équivalent d'appel de fonction :

std::operator<<(std::operator<<(std::cout, a++), a);

C garantit que les effets secondaires des évaluations précédentes seront effectués aux points de séquence. Cependant, il n'y a pas de points de séquence entre les évaluations des arguments, ce qui laisse l'ordre d'évaluation des arguments incertain : soit a peut être évalué avant a, soit vice versa.

Cette ambiguïté dans l'ordre d'évaluation rend le comportement de l'instruction indéfini. Cependant, dans le cas de a et a, le résultat du premier est utilisé comme argument pour le second, ce qui rend le résultat subordonné à l'ordre d'évaluation.

Mise à jour C 17 : Clarté au milieu des Ambiguïté

En C 17, les règles ont évolué. Une déclaration spécifique concernant les opérateurs de décalage a été introduite, stipulant que l'évaluation et les effets secondaires de l'opérande de gauche doivent se produire avant ceux de l'opérande de droite.

In a shift operator expression E1<>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2.

Par ce mandat, l'expression « un

Ce raffinement de la sémantique garantit la clarté et la cohérence dans l'évaluation des expressions. impliquant des opérateurs de quart de travail, s'alignant sur les pratiques idiomatiques du C.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn