Funktionsaufrufe in cout<< : Reihenfolge der Aufrufe
-
Hallo.
Ich hatte eine kleine Stackklasse implementiert, die unter anderem die Methoden pop (Rueckgabe und Eliminieren des obersten Elements) und peek (Rueckgabe ohne eliminieren des obersten Elements)
Ok, ich teste das dann kurz, fuelle den Stack dazu mit den zahlen von 0 bis 9 und will sie dann so ausgeben lassen:while(!s.isempty()) cout<<s.peek()<<" "<<s.pop()<<'\n';Ausgabe:
8 9
7 8
6 7
5 6
4 5
3 4
2 3
1 2
0 1gefolgt von einem runtime error.
Dann habe ich die beiden Befehle mal getrennt (also 2x cout, einmal fuer peek einmal fuer pop) und es ging. Es ging ebenfalls als ich die beiden Befehle umgedraht in einem cout angeschrieben habe (also erst pop dann peek), aber im Gegensatz zu meinen Erwartungen gibt das nun tatsaechlich
9 9
8 8
...
0 0
aus, obwohl pop ja vor peek aufgerufen wird.Mir erscheint es so, als wuerden bei cout die zuletzt aufgefuehrte Funktion zuerst aufgerufen. Ist dem so? Wenn nicht, wo kann der Fehler noch liegen? (nein, die Definitionen von pop und peek habe ich nicht zufaellig vertauscht)
EDIT: Compiler ist Visual C++ 2005 Express, soltle das notwendig sein.
-
Der Ausgabe-Operator ist eine (mehr oder weniger) normale Funktion in C++:
ostream& operator<<(ostream& file,int data);//mit (fast) beliebigen ParamternBei der Operator-Überladung wird diese Funktion dann mehrfach inneinander verschachtelt:
cout<<s.peek()<<" "<<s.pop()<<'\n'; //wird zu (Assoziativität) (((cout<<s.peek())<<" ")<<s.pop())<<'\n'; //wird zu op<<(op<<(op<<(op<<(cout,s.peek())," "),s.pop()),'\n');Das Problem ist, daß C++ keine Vorgaben macht, in welcher Reihenfolge die Parameter einer Funktion abgearbeitet werden sollen - es ist nur festgelegt, daß alle Parameter fertig ausgewertet sind, BEVOR die Funktion selber beginnt. Und der Compiler kann da natürlich auch beschließen, die Parameter von hinten nach vorne auszuwerten.
-
Ok, vielen Dank, dann macht Visual C++ 2005 Express das wohl scheinbar in "umgekehrter" Reihenfolge (also so wie ich es unlogisch finde) Ich hatte naemlich auch das so im Kopf wie du es beschrieben hast und dachte: "Na logisch, erst wird cout<<peek() ausgefuehrt und dann gehts eben so weiter."
Ist es schlechter Stil, Funtkionen die einander beeinflussen koennen hintereinander in cout o.ae. aufzurufen? Soll man in einem solchen Fall immer cout mehrmals aufrufen? (resp. den operator <<, ich gehe mal davon aus dass es fuer alle ostreams dann gleich ist)
-
Ja, es ist schlechter Stil (genauso wie der "Klassiker"
j=++i + i;). Da ist es im Ernstfall besser, mehrere op<< Aufrufe hintereinanderzuschreiben.(PS: cout kann man nicht "aufrufen" - höchstens seine Methoden)
-
Oik, vielen Dank.
Und entschuldige fuer das "cout aufrufen". Es ist mir bewusst, dass man cout sich aufruft, trotzdem sage ich das noch manchmal, warum auch immer.