<?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[CPP-Klausur]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich schreibe demnächst eine CPP-Klausur und habe einen Code, den ich nicht ganz verstehe. Habe es nicht so drauf mit Pointer und Adressen. Könnte mir hier jemand erklären, was in diesem Code gemacht wird?</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main() {
	int m=44;
	int *p=&amp;m;
	int &amp;r=m;
	int n=(*p)++;
	int *q=p-1;
	r=*(--p)+1;
	++*q;
	cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q;

	return 0;
}
</code></pre>
<p>Ich weiss nur, dass als erstes &quot;44&quot; ausgegeben wird, da bei der Variable n der Wert ausgegeben wird, der bei *p gespeichert ist. Auf die anderen Variablen komme ich leider nicht drauf. <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="😕"
    /><br />
Wäre echt lieb, wenn mir hier jemand dabei helfen könnte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
~<br />
Edit, Arcoth: Code-Tags~</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333150/cpp-klausur</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 05:24:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333150.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 15 Jun 2015 13:19:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to CPP-Klausur on Mon, 15 Jun 2015 16:09:15 GMT]]></title><description><![CDATA[<p>Hallo Community,</p>
<p>ich schreibe demnächst eine CPP-Klausur und habe einen Code, den ich nicht ganz verstehe. Habe es nicht so drauf mit Pointer und Adressen. Könnte mir hier jemand erklären, was in diesem Code gemacht wird?</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

int main() {
	int m=44;
	int *p=&amp;m;
	int &amp;r=m;
	int n=(*p)++;
	int *q=p-1;
	r=*(--p)+1;
	++*q;
	cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q;

	return 0;
}
</code></pre>
<p>Ich weiss nur, dass als erstes &quot;44&quot; ausgegeben wird, da bei der Variable n der Wert ausgegeben wird, der bei *p gespeichert ist. Auf die anderen Variablen komme ich leider nicht drauf. <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="😕"
    /><br />
Wäre echt lieb, wenn mir hier jemand dabei helfen könnte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
~<br />
Edit, Arcoth: Code-Tags~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456759</guid><dc:creator><![CDATA[MariaMaria]]></dc:creator><pubDate>Mon, 15 Jun 2015 16:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Mon, 15 Jun 2015 14:23:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>bin selber noch C++ Neuling, versuchs aber trotzdem mal.</p>
<p>Ausgabe von n=44, da int n=(*p)++ den Inhalt von p erst nach dieser Zeile erhöht</p>
<p>&amp;m gibt die Speicheradresse von m wieder (0x....)</p>
<p>int *p=&amp;m : p wird die Adresse von m zugewiesen<br />
(int n=(<em>p)++ : Wert an dieser Adresse wird um 1 erhöht auf 45, nach dieser Zeile. Aber in diesem Fall für die Ausgabe irrelevant)<br />
r=</em>(--p)+1; : p wird um 1 erniedrigt(also die Adresse auf die er zeigt, nicht der Inhalt, Rest der Zeile stellt keine Manipulation an p dar)<br />
=&gt; Ausgabe *p ergibt irgendeinen nicht definierten Wert, da er auf eine Adresse zeigt, der kein Wert zugewiesen wurde</p>
<p>int &amp;r=m : Referenz r auf Variable m wird erzeugt<br />
r=*(--p)+1 : r erhält folgenden Wert: Zeiger p wird erniedrigt und dessen Inhalt ausgelesen, dieser Inhalt wird noch um 1 erhöht<br />
=&gt; Ausgabe r ergibt wieder irgendeinen nicht definierten Wert</p>
<p>int *q=p-1 : Pointer *q wird definiert und initialisiert auf die Adresse &quot;links&quot; von p, welche wieder mit irgendeinem nicht definierten Wert belegt ist<br />
++*q: Inhalt der Adresse von q wird um 1 erhöht<br />
=&gt; Ausgabe *q ergibt nicht definierten Wert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456762</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Mon, 15 Jun 2015 14:23:09 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Mon, 15 Jun 2015 16:08:43 GMT]]></title><description><![CDATA[<p>Das Programm erzeugt leider undefiniertes Verhalten, und ist damit gänzlich ungeeignet. Wer hat die Aufgabe geschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456767</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 15 Jun 2015 16:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 10:37:22 GMT]]></title><description><![CDATA[<p>soweit ich das verstehe, meint Arcoth solche Sachen:</p>
<pre><code>int n = (*p)++;
</code></pre>
<p>weil nicht definiert ist, ob das ++ vor oder nach der Zuweisung geschieht. Korrigiert mich wenns falsch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456852</guid><dc:creator><![CDATA[hardware]]></dc:creator><pubDate>Tue, 16 Jun 2015 10:37:22 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 10:54:49 GMT]]></title><description><![CDATA[<p>Wann &quot;++&quot; ausgewertet wird ist in diesem Fall klar definiert. Nämlich nachdem der Wert von <code>(*p)</code> ermittelt wird -- steht ja hinten und nicht vorn dran.</p>
<p>Was zu UB führt ist dass hier &quot;ungültige&quot; Zeiger erzeugt und dann obendrein noch dereferenziert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456857</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 16 Jun 2015 10:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 10:57:36 GMT]]></title><description><![CDATA[<p>hardware schrieb:</p>
<blockquote>
<p>soweit ich das verstehe, meint Arcoth solche Sachen:</p>
<pre><code>int n = (*p)++;
</code></pre>
<p>weil nicht definiert ist, ob das ++ vor oder nach der Zuweisung geschieht. Korrigiert mich wenns falsch ist.</p>
</blockquote>
<p>ist falsch.</p>
<pre><code class="language-cpp">int main() { 
    int m=44; 
    int *p=&amp;m; 
//    int &amp;r=m; 
//    int n=(*p)++; 
    int *q=p-1; 
//    r=*(--p)+1;
    ++*q;
//    ^ (zeigt eins vor 'int m' -&gt; UB)
    cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q; 
//                                                                ^ (zeigt eins vor 'int m' -&gt; UB)
    return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2456858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456858</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 16 Jun 2015 10:57:36 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 11:16:00 GMT]]></title><description><![CDATA[<p>ok danke, da hab ich was falsches gemerkt, sehe jetzt auch das eigentliche UB.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456864</guid><dc:creator><![CDATA[hardware]]></dc:creator><pubDate>Tue, 16 Jun 2015 11:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 11:40:05 GMT]]></title><description><![CDATA[<p>Das UB passiert beim p-1, denn 1 von p abzuziehen ist hier nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456865</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 16 Jun 2015 11:40:05 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 12:42:57 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Das UB passiert beim p-1, denn 1 von p abzuziehen ist hier nicht erlaubt.</p>
</blockquote>
<p>N3337 schrieb:</p>
<blockquote>
<p><strong>5.7 Additive operators</strong><br />
2) `For subtraction, one of the following shall hold:</p>
<p>— both operands have arithmetic or unscoped enumeration type; or</p>
<p>— both operands are pointers to cv-qualified or cv-unqualified versions of the same completely-defined</p>
<p>object type; or</p>
<p>— the left operand is a pointer to a completely-defined object type and the right operand has integral or</p>
<p>unscoped enumeration type.</p>
<p>`</p>
<p><em>[...]</em></p>
<ol start="4">
<li><code>For the purposes of these operators, a pointer to a nonarray object behaves the same as a pointer to the first element of an array of length one with the type of the object as its element type.</code></li>
</ol>
</blockquote>
<p>so weit ich das sehe, ist also <code>T a; T* b = &amp;a-1;</code> kein UB sondern lediglich impl.defined behaviour (was in <code>b</code> bzw <code>*b</code> steht). UB wirds damit erst beim Zugriff auf b.</p>
<p>oder lieg ich da falsch?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456869</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 16 Jun 2015 12:42:57 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 12:59:20 GMT]]></title><description><![CDATA[<pre><code>#include &lt;iostream&gt; 
using namespace std;

int main() {
	int m = 44;
	int *p = &amp;m;
	int &amp;r = m;
	int n = *(p)++;
	int *q = p - 1;
	r = *(--p) + 1;
	++*q;
	cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q;

	return 0;
}
</code></pre>
<p>So funktioniert es einwandfrei... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456871</guid><dc:creator><![CDATA[mrv3112]]></dc:creator><pubDate>Tue, 16 Jun 2015 12:59:20 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 13:36:55 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>so weit ich das sehe, ist also <code>T a; T* b = &amp;a-1;</code> kein UB sondern lediglich impl.defined behaviour (was in <code>b</code> bzw <code>*b</code> steht). UB wirds damit erst beim Zugriff auf b.</p>
<p>oder lieg ich da falsch?</p>
</blockquote>
<p>Soweit ich weiss liegt du da falsch.<br />
IIRC ist sogar das UB:</p>
<pre><code class="language-cpp">int* p = new int(42);
delete p;
int* p2 = p; // &lt;-- UB
</code></pre>
<p>Und analog dazu auch</p>
<pre><code class="language-cpp">int* p = new int(42);
int* p2 = p - 1; // &lt;-- UB
</code></pre>
<p>und auch</p>
<pre><code class="language-cpp">int i;
int* p = &amp;i;
int* p2 = p - 1; // &lt;-- UB
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2456877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456877</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 16 Jun 2015 13:36:55 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 13:41:09 GMT]]></title><description><![CDATA[<p>mrv3112 schrieb:</p>
<blockquote>
<pre><code>#include &lt;iostream&gt; 
using namespace std;

int main() {
	int m = 44;
	int *p = &amp;m;
	int &amp;r = m;
	int n = *(p)++;
	int *q = p - 1;
	r = *(--p) + 1;
	++*q;
	cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q;

	return 0;
}
</code></pre>
<p>So funktioniert es einwandfrei... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Na sowas.<br />
Ist ja auch ganz anderer Code.<br />
<code>*(p)++</code> ist nicht das selbe wie <code>(*p)++</code></p>
<p>UB ist es allerdings vermutlich immer noch. (Oder gilt die &quot;one past last&quot; Ausnahme für alle Objekte und nicht nur für Arrays?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456879</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456879</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 16 Jun 2015 13:41:09 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 14:33:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>IIRC ist sogar das UB:</p>
<pre><code class="language-cpp">int* p = new int(42);
delete p;
int* p2 = p; // &lt;-- UB
</code></pre>
<p>Und analog dazu auch</p>
<pre><code class="language-cpp">int* p = new int(42);
int* p2 = p - 1; // &lt;-- UB
</code></pre>
<p>und auch</p>
<pre><code class="language-cpp">int i;
int* p = &amp;i;
int* p2 = p - 1; // &lt;-- UB
</code></pre>
</blockquote>
<p>Kannst du mir nochmal erklären, was das UB jetzt genau auslöst?<br />
Liegt das hier daran, dass mir der der Speicher vor p ggf nicht gehört oder ist das generell nicht erlaubt?</p>
<pre><code class="language-cpp">int i1;
int i2;
int* p = &amp;i2;
int* pvor = p - 1; // &lt;-- auch UB ?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2456885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456885</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Tue, 16 Jun 2015 14:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 15:02:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int* p = new int(42);
delete p;
int* p2 = p;
</code></pre>
<p>UB in C++03, implementation-defined ab C++11 (using invalid pointer value)</p>
<pre><code class="language-cpp">int* p = new int(42);
p - 1;
</code></pre>
<p>UB da p und p-1 nicht auf Elemente (bzw. 1 nach dem letzten Element) des gleichen Arrays zeigen</p>
<pre><code class="language-cpp">int i1;
int i2;
int* p = &amp;i2;
int* pvor = p - 1; // &lt;-- auch UB ?
</code></pre>
<p>Kein Unterschied. Die Tatsache, dass eine bestimmte Implementation sich möglicherweise dazu entscheidet, i1 unmittelbar vor i2 anzulegen (und dann ist das Ergebnis nat. definiert, weil p gleichzeitig auf eins-hinter-i1 zeigt), bedeutet nicht, dass der Standard das generell verlangt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456890</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Jun 2015 15:02:29 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 15:44:09 GMT]]></title><description><![CDATA[<p>Ok, danke für die Klarstellung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2456891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456891</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Tue, 16 Jun 2015 15:44:09 GMT</pubDate></item><item><title><![CDATA[Reply to CPP-Klausur on Tue, 16 Jun 2015 16:08:11 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>UB ist es allerdings vermutlich immer noch. (Oder gilt die &quot;one past last&quot; Ausnahme für alle Objekte und nicht nur für Arrays?)</p>
</blockquote>
<p>siehe mein post. gilt auch für (nicht-array) objekte. sollte somit well defined sein:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main() {
	int m = 44;
	int *p = &amp;m; //*p = &amp;m
	int &amp;r = m; //r = m
	int n = *(p)++; //p = &amp;m+1; n = 44
	int *q = p - 1; //q = &amp;m
	r = *(--p) + 1; //p = &amp;m //r=m=45
	++*q; //q=r=m=46
	cout &lt;&lt; n &lt;&lt; endl &lt;&lt; &amp;m &lt;&lt; endl &lt;&lt; *p &lt;&lt; endl &lt;&lt; r &lt;&lt; endl &lt;&lt; *q; //ok
//44
//[&amp;m] (adresse von m)
//46
//46
//46
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2456894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2456894</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 16 Jun 2015 16:08:11 GMT</pubDate></item></channel></rss>