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!