Maison >développement back-end >C++ >Pourquoi ce code C imprime-t-il « ba ​​» au lieu de « ab » ?

Pourquoi ce code C imprime-t-il « ba ​​» au lieu de « ab » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-31 16:01:10932parcourir

Why Does This C   Code Print

Dévoiler le mystère de l'impression de gauche à droite en C

Le comportement du code C suivant est déroutant :

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue() << myQueue.dequeue();

Étonnamment, il affiche "ba" sur la console au lieu du "ab" attendu. Pourquoi cela se produit-il ?

Pour résoudre cette énigme, nous devons comprendre la nature du << opérateur. En C , le << L'opérateur prend un nombre arbitraire d'arguments et renvoie une référence à un objet ostream. Dans ce cas, cout est l'objet ostream.

L'ordre d'évaluation des arguments de << n'est pas garanti par la norme C. Cela signifie que le compilateur est libre d'évaluer les arguments dans n'importe quel ordre, y compris potentiellement dans le désordre.

Dans notre exemple, le code se compile en une expression de la forme :

cout << ( (myQueue.dequeue()) << (myQueue.dequeue()) );

Le compilateur insère des parenthèses autour de chaque appel hors file d'attente et autour du résultat de l'appel récursif. Le résultat du deuxième appel de sortie de file d'attente est ensuite inséré dans les parenthèses entourant le premier.

La clé pour comprendre le comportement est de réaliser que les arguments du << Les opérateurs sont évalués de droite à gauche. Par conséquent, ce qui suit est équivalent au code ci-dessus :

( (myQueue.dequeue()) << (myQueue.dequeue()) ) << cout;

Dans cet ordre, le deuxième appel de sortie de file d'attente est évalué en premier, ce qui donne « b ». Le résultat de cet appel est ensuite transmis au << opérateur, qui renvoie une référence à cout. Le premier appel retiré de la file d'attente est ensuite évalué, ce qui donne 'a', qui est transmis à la référence renvoyée par le précédent << opérateur.

Cela explique pourquoi le code imprime "ba" au lieu de "ab". Le ≪≪ l'opérateur imprime d'abord « b », puis imprime « a ».

Pour garantir une impression cohérente de gauche à droite, des parenthèses doivent être utilisées pour contrôler explicitement l'ordre d'évaluation, comme suit :

cout << (myQueue.dequeue()) << ' ' << (myQueue.dequeue());

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