<?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[Rechstassoziativität unärer Operatoren]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe gerade gelesen, dass aufgrund der Rechtsassoziativität von Operatoren folgender Ausdruck auf folgende Weise umgesetzt wird:</p>
<pre><code class="language-cpp">*ziel++ = *quelle++;

// entspricht:

ziel.operator++().operator*(int).operator=(*quelle++);
// entspricht, mit erg1 = Ergebnis/Rückgabewert von ziel.operator++()
erg1.operator*(int).operator=(*quelle++);
// entspricht, mit erg2 = Ergebnis/Rückgabewert von erg1.operator*(int)
erg2.operator=(*quelle++);
</code></pre>
<p>Wenn ich von dem ganz einfachen Fall der Zuweisung der Werte zwischen zwei arrays mittels Zeigerarithmetik ausgehe:</p>
<pre><code class="language-cpp">int a[5];
for(int i = 0; i &lt; 5; ++i)
    a[i] = i;
int b[5];
int* aptr = a;
int* bptr = b;
for(int i = 0; i &lt; 5; ++i)
{
    *bptr++ = *aptr++;
}
</code></pre>
<p>...dann erfolgt doch erst die Derefernzierung und dann die Inkrementierung, d.h.</p>
<pre><code class="language-cpp">*bptr++ = *aptr++;
// entspricht
*bptr = *aptr;
bptr++;
aptr++;
</code></pre>
<p>Oder schmeiße ich da jetzt etwas durcheinander? Kann mich jemand aufklären?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/171612/rechstassoziativität-unärer-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 12:17:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/171612.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Jan 2007 14:32:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 14:32:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe gerade gelesen, dass aufgrund der Rechtsassoziativität von Operatoren folgender Ausdruck auf folgende Weise umgesetzt wird:</p>
<pre><code class="language-cpp">*ziel++ = *quelle++;

// entspricht:

ziel.operator++().operator*(int).operator=(*quelle++);
// entspricht, mit erg1 = Ergebnis/Rückgabewert von ziel.operator++()
erg1.operator*(int).operator=(*quelle++);
// entspricht, mit erg2 = Ergebnis/Rückgabewert von erg1.operator*(int)
erg2.operator=(*quelle++);
</code></pre>
<p>Wenn ich von dem ganz einfachen Fall der Zuweisung der Werte zwischen zwei arrays mittels Zeigerarithmetik ausgehe:</p>
<pre><code class="language-cpp">int a[5];
for(int i = 0; i &lt; 5; ++i)
    a[i] = i;
int b[5];
int* aptr = a;
int* bptr = b;
for(int i = 0; i &lt; 5; ++i)
{
    *bptr++ = *aptr++;
}
</code></pre>
<p>...dann erfolgt doch erst die Derefernzierung und dann die Inkrementierung, d.h.</p>
<pre><code class="language-cpp">*bptr++ = *aptr++;
// entspricht
*bptr = *aptr;
bptr++;
aptr++;
</code></pre>
<p>Oder schmeiße ich da jetzt etwas durcheinander? Kann mich jemand aufklären?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218074</guid><dc:creator><![CDATA[jklö]]></dc:creator><pubDate>Sat, 27 Jan 2007 14:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 15:58:54 GMT]]></title><description><![CDATA[<p>jklö schrieb:</p>
<blockquote>
<pre><code class="language-cpp">*ziel++ = *quelle++;

// entspricht:

ziel.operator++().operator*(int).operator=(*quelle++);
</code></pre>
</blockquote>
<p>Das ist schon falsch. Korrekt wäre:</p>
<pre><code class="language-cpp">ziel.operator ++(int()).operator *().operator =(*quelle+);
</code></pre>
<p>D.h. der 'int'-Parameter gehört zum Postfix-Inkrement, nicht zur Dereferenzierung.</p>
<blockquote>
<p>...dann erfolgt doch erst die Derefernzierung und dann die Inkrementierung</p>
</blockquote>
<p>Genau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218120</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 27 Jan 2007 15:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 17:21:12 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>der 'int'-Parameter gehört zum Postfix-Inkrement, nicht zur Dereferenzierung.</p>
</blockquote>
<p>Ooops, das habe ich zweimal in das falsche Klammernpaar gepackt, sorry.<br />
Aber das ist mir schon klar: Präfix- und Postfix-Inkrement unterscheiden sich durch die Übergabe des int.</p>
<p>Also, ich korrigiere das noch einmal, weil es an meiner eigentlichen Frage nichts ändert:</p>
<pre><code class="language-cpp">*ziel++ = *quelle++;

// entspricht:

ziel.operator++(int).operator*().operator=(*quelle++);
// entspricht, mit erg1 = Ergebnis/Rückgabewert von ziel.operator++()
erg1.operator*().operator=(*quelle++);
// entspricht, mit erg2 = Ergebnis/Rückgabewert von erg1.operator*(int)
erg2.operator=(*quelle++);
</code></pre>
<p>Trotzdem ist es doch dann offensichtlich so, dass der Inkrement-operator (in <strong>diesem</strong> Fall) zuerst ausgewertet wird: der Rückgabewert des Inkrement-Operators wird dereferenziert, oder nicht?<br />
Also genau andersherum als im Fall der Zeigerarithmetik.</p>
<p>Sorry, aber ich verstehe es immer noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218185</guid><dc:creator><![CDATA[jklö]]></dc:creator><pubDate>Sat, 27 Jan 2007 17:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 17:34:10 GMT]]></title><description><![CDATA[<p>Jetzt verstehe ich Deine Frage erst. ^^</p>
<p>jklö schrieb:</p>
<blockquote>
<p>Trotzdem ist es doch dann offensichtlich so, dass der Inkrement-operator (in diesem Fall) zuerst ausgewertet wird: der Rückgabewert des Inkrement-Operators wird dereferenziert, oder nicht?<br />
Also genau andersherum als im Fall der Zeigerarithmetik.</p>
</blockquote>
<p>Nein. Du musst Dir deutlich machen, was innerhalb des Operators ++(int) passiert:</p>
<pre><code class="language-cpp">struct T {
    T operator ++(int)
    {
        T ret = *this; // hier wird eine Kopie von *this erstellt!
        ++*this;       // *this inkrementieren
        return ret;    // unveränderte (!) Kopie zurückgeben.
    }
}
</code></pre>
<p>Im Prinzip hast Du also recht: Es wird der Rückgabewert des Inkrement-Operators dereferenziert. Aber bei diesem Wert handelt es sich um eine Kopie des eigentlichen Zeigers, bevor er dereferenziert wurde.</p>
<p>Spiel das ganze mal mit Indizes als Zeigerwerten nach, dann solltest Du es verstehen (also, am Anfang sind beide auf null, dann wird innerhalb von 'op++(int)' der Wert kopiert (ret = 0), erhöht (quelle = 1) und der Rückgabewert dereferenziert, also *0).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218197</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 27 Jan 2007 17:34:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 17:43:09 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Im Prinzip hast Du also recht: Es wird der Rückgabewert des Inkrement-Operators dereferenziert. Aber bei diesem Wert handelt es sich um eine Kopie des eigentlichen Zeigers, bevor er dereferenziert wurde.</p>
</blockquote>
<p>...was ja gerade den Unterschied zwischen Postfix und Präfix ausmacht...Oje, da bin ich jetzt aber schwer auf der Leitung gestanden!!!</p>
<p>Danke jedenfalls für die Erläuterungen, ich sehe wieder klar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218201</guid><dc:creator><![CDATA[jklö]]></dc:creator><pubDate>Sat, 27 Jan 2007 17:43:09 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 18:12:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Aber bei diesem Wert handelt es sich um eine Kopie des eigentlichen Zeigers, bevor er dereferenziert wurde.</p>
</blockquote>
<p>Nö, bevor er inkrementiert wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218228</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 27 Jan 2007 18:12:50 GMT</pubDate></item><item><title><![CDATA[Reply to Rechstassoziativität unärer Operatoren on Sat, 27 Jan 2007 18:15:25 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<blockquote>
<p>Aber bei diesem Wert handelt es sich um eine Kopie des eigentlichen Zeigers, bevor er dereferenziert wurde.</p>
</blockquote>
<p>Nö, bevor er inkrementiert wurde <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Äh, ja, das meinte ich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1218229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1218229</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Sat, 27 Jan 2007 18:15:25 GMT</pubDate></item></channel></rss>