<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe]]></title><description><![CDATA[<p>Hallo.</p>
<p>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)<br />
Ok, ich teste das dann kurz, fuelle den Stack dazu mit den zahlen von 0 bis 9 und will sie dann so ausgeben lassen:</p>
<pre><code class="language-cpp">while(!s.isempty())
    cout&lt;&lt;s.peek()&lt;&lt;&quot; &quot;&lt;&lt;s.pop()&lt;&lt;'\n';
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>8 9<br />
7 8<br />
6 7<br />
5 6<br />
4 5<br />
3 4<br />
2 3<br />
1 2<br />
0 1</p>
</blockquote>
<p>gefolgt von einem runtime error.</p>
<p>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<br />
9 9<br />
8 8<br />
...<br />
0 0<br />
aus, obwohl pop ja vor peek aufgerufen wird.</p>
<p>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)</p>
<p>EDIT: Compiler ist Visual C++ 2005 Express, soltle das notwendig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/176220/funktionsaufrufe-in-cout-lt-lt-reihenfolge-der-aufrufe</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 11:25:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/176220.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Mar 2007 09:51:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe on Mon, 19 Mar 2007 09:53:57 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>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)<br />
Ok, ich teste das dann kurz, fuelle den Stack dazu mit den zahlen von 0 bis 9 und will sie dann so ausgeben lassen:</p>
<pre><code class="language-cpp">while(!s.isempty())
    cout&lt;&lt;s.peek()&lt;&lt;&quot; &quot;&lt;&lt;s.pop()&lt;&lt;'\n';
</code></pre>
<p>Ausgabe:</p>
<blockquote>
<p>8 9<br />
7 8<br />
6 7<br />
5 6<br />
4 5<br />
3 4<br />
2 3<br />
1 2<br />
0 1</p>
</blockquote>
<p>gefolgt von einem runtime error.</p>
<p>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<br />
9 9<br />
8 8<br />
...<br />
0 0<br />
aus, obwohl pop ja vor peek aufgerufen wird.</p>
<p>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)</p>
<p>EDIT: Compiler ist Visual C++ 2005 Express, soltle das notwendig sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248209</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Mon, 19 Mar 2007 09:53:57 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe on Mon, 19 Mar 2007 09:59:53 GMT]]></title><description><![CDATA[<p>Der Ausgabe-Operator ist eine (mehr oder weniger) normale Funktion in C++:</p>
<pre><code class="language-cpp">ostream&amp; operator&lt;&lt;(ostream&amp; file,int data);//mit (fast) beliebigen Paramtern
</code></pre>
<p>Bei der Operator-Überladung wird diese Funktion dann mehrfach inneinander verschachtelt:</p>
<pre><code class="language-cpp">cout&lt;&lt;s.peek()&lt;&lt;&quot; &quot;&lt;&lt;s.pop()&lt;&lt;'\n';
//wird zu (Assoziativität)
(((cout&lt;&lt;s.peek())&lt;&lt;&quot; &quot;)&lt;&lt;s.pop())&lt;&lt;'\n';
//wird zu
op&lt;&lt;(op&lt;&lt;(op&lt;&lt;(op&lt;&lt;(cout,s.peek()),&quot; &quot;),s.pop()),'\n');
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248214</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 19 Mar 2007 09:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe on Mon, 19 Mar 2007 10:03:43 GMT]]></title><description><![CDATA[<p>Ok, vielen Dank, dann macht Visual C++ 2005 Express das wohl scheinbar in &quot;umgekehrter&quot; Reihenfolge (also so wie ich es unlogisch finde) Ich hatte naemlich auch das so im Kopf wie du es beschrieben hast und dachte: &quot;Na logisch, erst wird cout&lt;&lt;peek() ausgefuehrt und dann gehts eben so weiter.&quot;</p>
<p>Ist es schlechter Stil, Funtkionen die einander beeinflussen koennen hintereinander in cout <a href="http://o.ae" rel="nofollow">o.ae</a>. aufzurufen? Soll man in einem solchen Fall immer cout mehrmals aufrufen? (resp. den operator &lt;&lt;, ich gehe mal davon aus dass es fuer alle ostreams dann gleich ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248217</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Mon, 19 Mar 2007 10:03:43 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe on Mon, 19 Mar 2007 10:07:31 GMT]]></title><description><![CDATA[<p>Ja, es ist schlechter Stil (genauso wie der &quot;Klassiker&quot; <code>j=++i + i;</code> ). Da ist es im Ernstfall besser, mehrere op&lt;&lt; Aufrufe hintereinanderzuschreiben.</p>
<p>(PS: cout kann man nicht &quot;aufrufen&quot; - höchstens seine Methoden)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248221</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 19 Mar 2007 10:07:31 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionsaufrufe in cout&amp;lt;&amp;lt; : Reihenfolge der Aufrufe on Mon, 19 Mar 2007 10:20:24 GMT]]></title><description><![CDATA[<p>Oik, vielen Dank.</p>
<p>Und entschuldige fuer das &quot;cout aufrufen&quot;. Es ist mir bewusst, dass man cout sich aufruft, trotzdem sage ich das noch manchmal, warum auch immer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1248234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1248234</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Mon, 19 Mar 2007 10:20:24 GMT</pubDate></item></channel></rss>