2010-01-24 10 views
23

den folgenden Code:cout << Reihenfolge des Aufrufs zu Funktionen druckt es?

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

prints "ba" auf der Konsole

während:

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

druckt "ab" Warum?

Es scheint, als ob cout die äußerste (am nächsten zu der;) Funktion zuerst aufruft und sich einarbeitet, ist das so, wie es sich verhält?

+0

markiert wo gingen alle Antworten hin? Jetzt gibt es nur einen? – finiteloop

+1

Die Antwortenden löschten sie, weil sie erkannten, dass sie falsch lagen. –

+1

Manche Leute löschen Antworten, wenn sie herausfinden, dass sie falsch liegen. –

Antwort

28

Es gibt keinen Sequenzpunkt mit dem Operator <<, so dass der Compiler die Funktion dequeue zuerst frei auswerten kann. Was garantiert ist, ist das Ergebnis des zweiten Aufrufs (in der Reihenfolge, in der es in dem Ausdruck erscheint und nicht notwendigerweise in der Reihenfolge, in der es ausgewertet wird) zu dem Ergebnis von << der erste (wenn Sie bekomme, was ich sage).

So der Compiler ist frei, um Ihren Code in etwas wie jede dieser zu übersetzen (Pseudo-Zwischenstufe C++). Dies soll keine erschöpfende Liste sein.

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

oder

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

oder

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

Hier ist, was die Provisorien entsprechen in den ursprünglichen Ausdruck.

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

Also, im oberen Beispiel würde Std :: ostream & tmp3 = cout << tmp1; tmp3 << tmp2; sei wie "cout << tmp1 << tmp2;" sagen? Oder etwas, das ich vermisse? – finiteloop

+0

@segault: Ja, denn das ist der Weg '' 'assoziiert in C++ - Grammatik. 'a << b << c' gruppiert immer als '(a << b) << c '. –

+0

aber durch diese Logik würde nicht sagen, dass cout << a << b sagen (cout << a) << b und alles Notwendige tun, um eine erste zu cout (d. H. MyQueue.dequeue() aufrufen)? – finiteloop

6

Der Anruf von Ihrem Beispiel:

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

mit zwei Anrufen von operator<< Funktion auf den folgenden Ausdruck übersetzt:

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

Die Reihenfolge der Auswertung von cout ist myQueue.dequeue() nicht näher bezeichnet. Die Reihenfolge der Funktionsaufrufe operator<< ist jedoch gut spezifiziert, wie mit 1 und 2

Verwandte Themen