Maison >développement back-end >C++ >Pourquoi ce code C imprime-t-il « ba » au lieu de « ab » ?
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!