Dévoilement de l'énigme du « cout << a << a » : comportement indéfini ou 01 prédestiné ?
Dans une interview récente, une énigme de codage énigmatique fait surface :
int a = 0; cout << a++ << a;
Avec des options tentantes parmi lesquelles choisir, dont 10, 01 et le mystérieux « comportement indéfini », la personne interrogée a sélectionné avec confiance 01, citant sa compréhension des points de séquence. Cependant, la réponse de l'intervieweur a été accueillie avec étonnement : la bonne réponse était, étonnamment, indéfinie.
Explorer un territoire non défini
Les points de séquence garantissent généralement l'achèvement des effets secondaires avant passer aux évaluations ultérieures. Curieusement, la déclaration en question ne possède aucun point de séquence entre les évaluations des arguments. Cela signifie que l'argument "a" peut être calculé avant ou après l'argument "cout << a ." Cette ambiguïté rend le résultat imprévisible, d'où la perception d'un comportement indéfini.
Une lueur d'espoir en C 17
Le paysage du codage a été transformé en C 17, où les règles régissant l'évaluation de l'expression ont été révisées. Les dernières directives stipulent explicitement que dans les expressions d'opérateur de décalage, tous les calculs et effets secondaires du premier argument ("E1") sont séquencés avant ceux du deuxième argument ("E2").
Cet ajustement crucial impose le extrait de code en question vers la sortie 01. Le comportement insaisissable et indéfini a été dissipé, remplacé par la certitude d'un résultat prédéterminé.
Une plongée plus profonde dans les braises de P0145R3
Pour ceux qui recherchent une compréhension plus complète, le document technique P0145R3 : Affiner l'ordre d'évaluation de l'expression pour le C idiomatique plonge dans les détails complexes de l'ordre d'évaluation de l'expression révisé, fournissant un aperçu approfondi de l'évolution du paradigme de codage 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!