<?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[Shiftoperator und Auswertungsreihenfolge?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte mal eine Frage zu <code>std::cout</code> . Und zwar wenn ich etwas habe wie</p>
<pre><code>#include &lt;iostream&gt;

int main() {
    int i = 1 &lt;&lt; 2;
    std::cout &lt;&lt; i &lt;&lt; '\n'; // Ausgabe: 4
    std::cout &lt;&lt; 1 &lt;&lt; 2 &lt;&lt; '\n'; // Ausgabe: 12
}
</code></pre>
<p>Woher weiß der Compiler jetzt was er hier machen soll bzw. ist die zweite Ausgabe nicht eigentlich undefiniert? Weil der Compiler könnte doch (nach meinem Verständnis) <em>entweder</em></p>
<p><code>operator&lt;&lt;(std::cout, operator&lt;&lt;(1, 2))</code></p>
<p><em>oder</em></p>
<p><code>operator&lt;&lt;(operator&lt;&lt;(std::cout, 1), 2)</code></p>
<p>wählen, da die Auswertungsreihenfolge ja undefiniert ist, oder?</p>
<p>Dann würden aber jeweils unterschiedliche Werte (siehe oben) rauskommen! Also woher &quot;weiß&quot; der Compiler das bzw. warum macht er das hier immer &quot;richtig&quot;? Ist hier die Auswertungsreihenfolge <em>doch</em> definiert oder ist das &quot;glücklicher Zufall&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330370/shiftoperator-und-auswertungsreihenfolge</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 11:35:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330370.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Jan 2015 11:33:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Shiftoperator und Auswertungsreihenfolge? on Wed, 07 Jan 2015 11:33:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hätte mal eine Frage zu <code>std::cout</code> . Und zwar wenn ich etwas habe wie</p>
<pre><code>#include &lt;iostream&gt;

int main() {
    int i = 1 &lt;&lt; 2;
    std::cout &lt;&lt; i &lt;&lt; '\n'; // Ausgabe: 4
    std::cout &lt;&lt; 1 &lt;&lt; 2 &lt;&lt; '\n'; // Ausgabe: 12
}
</code></pre>
<p>Woher weiß der Compiler jetzt was er hier machen soll bzw. ist die zweite Ausgabe nicht eigentlich undefiniert? Weil der Compiler könnte doch (nach meinem Verständnis) <em>entweder</em></p>
<p><code>operator&lt;&lt;(std::cout, operator&lt;&lt;(1, 2))</code></p>
<p><em>oder</em></p>
<p><code>operator&lt;&lt;(operator&lt;&lt;(std::cout, 1), 2)</code></p>
<p>wählen, da die Auswertungsreihenfolge ja undefiniert ist, oder?</p>
<p>Dann würden aber jeweils unterschiedliche Werte (siehe oben) rauskommen! Also woher &quot;weiß&quot; der Compiler das bzw. warum macht er das hier immer &quot;richtig&quot;? Ist hier die Auswertungsreihenfolge <em>doch</em> definiert oder ist das &quot;glücklicher Zufall&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2436327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2436327</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 07 Jan 2015 11:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Shiftoperator und Auswertungsreihenfolge? on Wed, 07 Jan 2015 11:36:02 GMT]]></title><description><![CDATA[<p>Die undefinierte Auswertungsreihenfolge spielt nur bei so etwas eine Rolle:</p>
<pre><code>std::cout &lt;&lt; ++i &lt;&lt; ++i &lt;&lt; '\n'; // UB
</code></pre>
<p>Was in welcher Reihenfolge ausgegeben wird, ist wohl definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2436328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2436328</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 07 Jan 2015 11:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Shiftoperator und Auswertungsreihenfolge? on Wed, 07 Jan 2015 12:28:24 GMT]]></title><description><![CDATA[<p>Du musst zwischen Ausführung und Auswertung unterscheiden.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; f() &lt;&lt; g() &lt;&lt; '\n';
</code></pre>
<p>ist das gleiche wie</p>
<pre><code class="language-cpp">((std::cout &lt;&lt; f()) &lt;&lt; g()) &lt;&lt; '\n';
</code></pre>
<p>da der &lt;&lt;-operator Linksassoziativ ist. (So wie a/b/c=(a/b)/c.)</p>
<p>Nicht definiert ist hingegen die Auswertung der Argumente. Man könnte entweder</p>
<pre><code class="language-cpp">auto&amp;&amp; x = f();
auto&amp;&amp; y = g();
((std::cout &lt;&lt; x) &lt;&lt; y) &lt;&lt; '\n';
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">auto&amp;&amp; y = g();
auto&amp;&amp; x = f();
((std::cout &lt;&lt; x) &lt;&lt; y) &lt;&lt; '\n';
</code></pre>
<p>haben.</p>
<p>Das ist jedoch nicht UB, das ist nur unspezifiziert. Der Compiler darf sich entscheiden, wie er das machen will, aber solange dir das egal ist, hast du kein Problem.</p>
<p>UB kommt nur dann ins Spiel, wenn auf Werte mehrmals lesend und schreibend zugegriffen wird.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; ++i &lt;&lt; ++i &lt;&lt; '\n'; // UB
</code></pre>
<p>Das ist UB (aber nur für primitive Typen!). Du kannst es dir so vorstellen, dass in</p>
<pre><code class="language-cpp">int x = i;
i = x + 1;
int y = i;
i = y + 1;
</code></pre>
<p>je nach Reihenfolge am Ende i nur um 1 erhöht wurde, was den Regeln widerspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2436336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2436336</guid><dc:creator><![CDATA[klammeraffe]]></dc:creator><pubDate>Wed, 07 Jan 2015 12:28:24 GMT</pubDate></item><item><title><![CDATA[Reply to Shiftoperator und Auswertungsreihenfolge? on Wed, 07 Jan 2015 12:52:22 GMT]]></title><description><![CDATA[<p>klammeraffe schrieb:</p>
<blockquote>
<p>Man könnte entweder</p>
<pre><code class="language-cpp">auto&amp;&amp; x = f();
auto&amp;&amp; y = g();
((std::cout &lt;&lt; x) &lt;&lt; y) &lt;&lt; '\n';
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">auto&amp;&amp; y = g();
auto&amp;&amp; x = f();
((std::cout &lt;&lt; x) &lt;&lt; y) &lt;&lt; '\n';
</code></pre>
<p>haben.</p>
</blockquote>
<p>Ausserdem könnte evtl die Ausgabe von f() erfolgen bevor g() aufgerufen wird (was beobachtbar wäre, wenn g() selbst etwas ausgibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2436339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2436339</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 07 Jan 2015 12:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Shiftoperator und Auswertungsreihenfolge? on Wed, 07 Jan 2015 12:56:14 GMT]]></title><description><![CDATA[<p>Ok, alles klar. Vielen Dank für die Antworten, hab glatt die Assoziativität bei der ganzen Geschichte vergessen. Jetzt macht das Sinn <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2436340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2436340</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Wed, 07 Jan 2015 12:56:14 GMT</pubDate></item></channel></rss>