<?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[Unerwünschte Schlauheit vom Compiler]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Folgendes kleines Programm:</p>
<p>int&amp; fkt(int&amp; a){<br />
return a;<br />
}</p>
<p>int main(){<br />
int x = 5000;<br />
cout &lt;&lt; fkt(x) &lt;&lt; endl;<br />
return 0;<br />
}</p>
<p>Nach der Ausführung der Funktion hat x wie erwartet den Wert 5000. Das &quot;Ergebnis&quot; von fkt(x) ist also eine Zahl.</p>
<p>Nun eine kleine Veränderung im main-Rumpf:</p>
<p>int&amp; fkt(int&amp; a){<br />
return a;<br />
}</p>
<p>int main(){<br />
int x = 5000;<br />
fkt(x) = 1;<br />
cout &lt;&lt; x &lt;&lt; endl;<br />
return 0;<br />
}</p>
<p>Hier erfolgt eine Zuweisung von 1 an a, und somit an x, da a ja eine Referenz von x ist.</p>
<p>Im ersten Fall spuckt fkt(x) eine Zahl raus, nämlich 5000.<br />
Im zweiten Fall &quot;erlaubt&quot; der Compiler die Betrachtung von fkt(x) weiterhin als Referenz von x, deshalb konnte die Zuweisung problemlos erfolgen.</p>
<p>Mir weist dies aber eine gewisse Unkonsistenz vom Compiler. Ich hätte gewünscht, dass der 2. Fall einen Fehler fabrizieren würde, da 5000 ≠ 1.<br />
Also, mir kommts so vor, als der Compiler so schlau ist und guckt erstmal wofür das Ergebnis der Funktion verwendet wird, je nachdem macht er dann diese Anpassung.</p>
<p>Oder liegt da ein Denkfehler meinerseits? Ich bedanke mich für jegliche Hilfestellung.</p>
<p>Grüße aus dem Rheinland,</p>
<p>Leon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263382/unerwünschte-schlauheit-vom-compiler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 19:26:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263382.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Mar 2010 20:16:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 20:16:32 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>Folgendes kleines Programm:</p>
<p>int&amp; fkt(int&amp; a){<br />
return a;<br />
}</p>
<p>int main(){<br />
int x = 5000;<br />
cout &lt;&lt; fkt(x) &lt;&lt; endl;<br />
return 0;<br />
}</p>
<p>Nach der Ausführung der Funktion hat x wie erwartet den Wert 5000. Das &quot;Ergebnis&quot; von fkt(x) ist also eine Zahl.</p>
<p>Nun eine kleine Veränderung im main-Rumpf:</p>
<p>int&amp; fkt(int&amp; a){<br />
return a;<br />
}</p>
<p>int main(){<br />
int x = 5000;<br />
fkt(x) = 1;<br />
cout &lt;&lt; x &lt;&lt; endl;<br />
return 0;<br />
}</p>
<p>Hier erfolgt eine Zuweisung von 1 an a, und somit an x, da a ja eine Referenz von x ist.</p>
<p>Im ersten Fall spuckt fkt(x) eine Zahl raus, nämlich 5000.<br />
Im zweiten Fall &quot;erlaubt&quot; der Compiler die Betrachtung von fkt(x) weiterhin als Referenz von x, deshalb konnte die Zuweisung problemlos erfolgen.</p>
<p>Mir weist dies aber eine gewisse Unkonsistenz vom Compiler. Ich hätte gewünscht, dass der 2. Fall einen Fehler fabrizieren würde, da 5000 ≠ 1.<br />
Also, mir kommts so vor, als der Compiler so schlau ist und guckt erstmal wofür das Ergebnis der Funktion verwendet wird, je nachdem macht er dann diese Anpassung.</p>
<p>Oder liegt da ein Denkfehler meinerseits? Ich bedanke mich für jegliche Hilfestellung.</p>
<p>Grüße aus dem Rheinland,</p>
<p>Leon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871452</guid><dc:creator><![CDATA[gogalop23]]></dc:creator><pubDate>Fri, 19 Mar 2010 20:16:32 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 20:24:08 GMT]]></title><description><![CDATA[<p>Das ist vollkommen richtiges Verhalten.</p>
<blockquote>
<p>Ich hätte gewünscht, dass der 2. Fall einen Fehler fabrizieren würde, da 5000 ≠ 1.</p>
</blockquote>
<p>Warum? ftk(x) gibt einfach eine Referenz auf x zurück, d.h. fkt(x) IST x. Wenn du jetzt eine Zuweisung durchführst (fkt(x) = 1;), dann ist x nachher eben 1.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871457</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871457</guid><dc:creator><![CDATA[Bruder Lustig]]></dc:creator><pubDate>Fri, 19 Mar 2010 20:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 20:27:54 GMT]]></title><description><![CDATA[<blockquote>
<p>Mir weist dies aber eine gewisse Unkonsistenz vom Compiler. Ich hätte gewünscht, dass der 2. Fall einen Fehler fabrizieren würde, da 5000 ≠ 1.</p>
</blockquote>
<p>Den Fehler kriegst du auch, wenn du ein == statt = verwendest.<br />
Ansonsten, wenn du die zurückgegebene Referenz nur als R-Value verwenden möchtest, mach sie const.</p>
<pre><code class="language-cpp">const int &amp;fkt(int &amp;a)
{
    return a;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1871461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871461</guid><dc:creator><![CDATA[blub* 0]]></dc:creator><pubDate>Fri, 19 Mar 2010 20:27:54 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 20:38:26 GMT]]></title><description><![CDATA[<p>gogalop23 schrieb:</p>
<blockquote>
<p>Das &quot;Ergebnis&quot; von fkt(x) ist also eine Zahl.</p>
</blockquote>
<p>Das &quot;Ergebnis&quot; von fkt(x) ist keine Zahl, sondern eine Referenz auf ein <code>int</code> -Objekt, welches irgend eine Zahl speichert.</p>
<p>gogalop23 schrieb:</p>
<blockquote>
<p>Mir weist dies aber eine gewisse Unkonsistenz vom Compiler.</p>
</blockquote>
<p>Wo siehst Du hier eine Inkonsistenz?</p>
<p>gogalop23 schrieb:</p>
<blockquote>
<p>Ich hätte gewünscht, dass der 2. Fall einen Fehler fabrizieren würde, da 5000 ≠ 1.</p>
</blockquote>
<p>Was hat das eine mit dem anderen zu tun?</p>
<p>gogalop23 schrieb:</p>
<blockquote>
<p>Also, mir kommts so vor, als der Compiler so schlau ist und guckt erstmal wofür das Ergebnis der Funktion verwendet wird, ...</p>
</blockquote>
<p>Hier passiert nichts besonderes. Klappt alles so, wie es soll. Wenn Du die Funktion eine &quot;Zahl&quot; zurückgeben lassen willst, musst Du <code>int</code> statt <code>int&amp;</code> als Rückgabetyp verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871466</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Fri, 19 Mar 2010 20:38:26 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 20:48:01 GMT]]></title><description><![CDATA[<p>Das ist keine Inkosistenz im Compiler, sondern eher inkonsistente Benutzung von Referenzen deinerseits. Der Compiler verhält sich da genau so wie der Standard es vorschreibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871471</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 19 Mar 2010 20:48:01 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 21:00:03 GMT]]></title><description><![CDATA[<p>Vielleicht solltest Du Dir mal eine deklarativ-funktionale Sprache wie z.B. Prolog ansehen. Dort werden Variablen wie von Dir erwartet bei der Deklaration an einen Wert gebunden.<br />
In imperativen Sprachen wie C++ ist das hingegen anders.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871475</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 19 Mar 2010 21:00:03 GMT</pubDate></item><item><title><![CDATA[Reply to Unerwünschte Schlauheit vom Compiler on Fri, 19 Mar 2010 22:43:25 GMT]]></title><description><![CDATA[<p>Ich glaube dem OP ist einfach nicht klar wie Referenzen in C++ zu verstehen sind, und wann und wo die Umwandlung einer Lvalue in eine Rvalue erfolgt, bzw. was das überhaupt ist.</p>
<p>Ist ja auch nicht ganz einfach zu verstehen/erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1871501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1871501</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 19 Mar 2010 22:43:25 GMT</pubDate></item></channel></rss>