2010-01-24 7 views
23

le code suivant:cout << ordre d'appel aux fonctions qu'il imprime?

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

imprime "ba" à la console

tandis que:

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

estampes "ab" pourquoi est-ce?

Il semblerait que cout appelle la fonction la plus extérieure (la plus proche de la;) en premier et se fraye un chemin, est-ce la façon dont elle se comporte?

+0

où toutes les réponses sont-elles allées? maintenant il n'y en a qu'un? – finiteloop

+1

Les répondeurs les ont supprimés parce qu'ils se sont rendu compte qu'ils avaient tort. –

+1

Certaines personnes suppriment des réponses lorsqu'elles découvrent qu'elles ont tort. –

Répondre

28

Il n'y a pas de point de séquence avec l'opérateur << donc le compilateur est libre d'évaluer d'abord la fonction dequeue. Ce qui est garanti est que le résultat du deuxième appel dequeue (dans l'ordre dans lequel il apparaît dans l'expression et pas nécessairement dans l'ordre dans lequel il est évalué) est << 'au résultat de <<' obtenez ce que je dis).

Ainsi, le compilateur est libre de traduire votre code en quelque chose comme l'un de ceux-ci (pseudo intermédiaire C++). Ceci n'est pas destiné à être une liste exhaustive.

auto tmp2 = myQueue.dequeue(); 
auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

ou

auto tmp1 = myQueue.dequeue(); 
auto tmp2 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
tmp3 << tmp2; 

ou

auto tmp1 = myQueue.dequeue(); 
std::ostream& tmp3 = cout << tmp1; 
auto tmp2 = myQueue.dequeue(); 
tmp3 << tmp2; 

Voici ce que les correspondent aux temporaires l'expression originale.

cout << myQueue.dequeue() << myQueue.dequeue(); 
|  |    | |    | 
|  |____ tmp1 _____| |_____ tmp2 ____| 
|      | 
|________ tmp3 _________| 
+0

donc, dans l'exemple supérieur, std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; être comme dire "cout << tmp1 << tmp2;" "? Ou quelque chose qui me manque? – finiteloop

+0

@segfault: Oui, parce que c'est ainsi que '' 's'associe en grammaire C++. 'a << b << c' se groupe toujours comme' (a << b) << c'. –

+0

mais par cette logique, ne dirait pas cout << a << b dire (cout << a) << b et faire tout ce qui est necessaire pour cout un premier (c'est-a-dire appelez myQueue.dequeue())? – finiteloop

6

L'appel de votre exemple:

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

se traduit par l'expression suivante avec deux appels de operator<< fonction:

operator<<(operator<<(cout, myQueue.dequeue()), myQueue.dequeue()); 
-------------------- 1 
---------2 

L'ordre d'évaluation des cout, myQueue.dequeue() est non spécifiée. Cependant, l'ordre des appels de fonction operator<< est bien spécifié, comme marqué avec 1 et 2