<?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[Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade C++ zu lernen. Und dabei bin ich letztens über eine Referenz in einer Doppel-Schleife gestolpert.<br />
Ich finde den Code dazu allerdings leider nicht wieder. Darum mal kurz meine Frage mündlich formuliert..:</p>
<p>zB. habe ich:</p>
<pre><code>for(int j; ; ){int i; ...}
</code></pre>
<p>Stimmt es, dass &quot;i&quot; und &quot;j&quot; erst nach Beendigung der kompletten Schleife vernichtet werden, also nicht nach jedem Schleifendurchlauf?!<br />
So hab ich das jedenfalls verstanden.</p>
<p>Was ist nun aber mit Variablen (eig. Referenzen, denn so war das Beispiel..)<br />
innerhalb einer Schleife in einer Schleife, also innerhalb von Mehrfachschleifen??</p>
<p>zB:</p>
<pre><code>for_aussen(){ for_innen(){ int i; ... } }
</code></pre>
<p>Wird hier das &quot;i&quot; nach jedem Schleifendurchlauf von for_aussen() zerstört und wieder erzeugt???<br />
(Würde ich erstmal so annehmen..) Und verhalten sich Referenzen identisch dazu?</p>
<p>Gibt es einen allgemeinen Tipp, wie mit Variablen innerhalb von Schleifen umzugehen ist?? Also zB. alle Variablen schon außerhalb einrichten...?!</p>
<p>Das wärs auch schon.</p>
<p>MfG<br />
Klon457</p>
<p>PS. ...Sorry für den unformattieren Code, besser gings hier nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326583/gültigkeitsbereich-einer-referenz-variablen-bei-mahrfachschleifen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 31 May 2026 01:09:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326583.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 24 Jun 2014 19:11:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 19:11:40 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche gerade C++ zu lernen. Und dabei bin ich letztens über eine Referenz in einer Doppel-Schleife gestolpert.<br />
Ich finde den Code dazu allerdings leider nicht wieder. Darum mal kurz meine Frage mündlich formuliert..:</p>
<p>zB. habe ich:</p>
<pre><code>for(int j; ; ){int i; ...}
</code></pre>
<p>Stimmt es, dass &quot;i&quot; und &quot;j&quot; erst nach Beendigung der kompletten Schleife vernichtet werden, also nicht nach jedem Schleifendurchlauf?!<br />
So hab ich das jedenfalls verstanden.</p>
<p>Was ist nun aber mit Variablen (eig. Referenzen, denn so war das Beispiel..)<br />
innerhalb einer Schleife in einer Schleife, also innerhalb von Mehrfachschleifen??</p>
<p>zB:</p>
<pre><code>for_aussen(){ for_innen(){ int i; ... } }
</code></pre>
<p>Wird hier das &quot;i&quot; nach jedem Schleifendurchlauf von for_aussen() zerstört und wieder erzeugt???<br />
(Würde ich erstmal so annehmen..) Und verhalten sich Referenzen identisch dazu?</p>
<p>Gibt es einen allgemeinen Tipp, wie mit Variablen innerhalb von Schleifen umzugehen ist?? Also zB. alle Variablen schon außerhalb einrichten...?!</p>
<p>Das wärs auch schon.</p>
<p>MfG<br />
Klon457</p>
<p>PS. ...Sorry für den unformattieren Code, besser gings hier nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405439</guid><dc:creator><![CDATA[Klon457]]></dc:creator><pubDate>Tue, 24 Jun 2014 19:11:40 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 19:21:19 GMT]]></title><description><![CDATA[<p>Klon457 schrieb:</p>
<blockquote>
<pre><code>for(int j; ; ){int i; ...}
</code></pre>
<p>Stimmt es, dass &quot;i&quot; und &quot;j&quot; erst nach Beendigung der kompletten Schleife vernichtet werden, also nicht nach jedem Schleifendurchlauf?!</p>
</blockquote>
<p>j ist für die ganze Schleife gültig. i ist nur im Körper der Schleife gültig (dh wird jeweils am Ende zerstört und beim nächsten Durchlauf neu angelegt.)</p>
<blockquote>
<p>Was ist nun aber mit Variablen (eig. Referenzen, denn so war das Beispiel..)<br />
innerhalb einer Schleife in einer Schleife, also innerhalb von Mehrfachschleifen??</p>
</blockquote>
<p>Prinzipiell gibt es da nichts neues.</p>
<blockquote>
<p>Also zB. alle Variablen schon außerhalb einrichten...?!</p>
</blockquote>
<p>Warum? Jede nur da wo sie gebraucht wird, im Normalfall so lokal wie möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405444</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 24 Jun 2014 19:21:19 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 19:28:39 GMT]]></title><description><![CDATA[<blockquote>
<p>Stimmt es, dass &quot;i&quot; und &quot;j&quot; erst nach Beendigung der kompletten Schleife vernichtet werden, also nicht nach jedem Schleifendurchlauf?!</p>
</blockquote>
<p>Nein. <code>i</code> wird in jedem Schleifendurchlauf erzeugt und zerstört; <code>j</code> nur einmal pro Schleifenausführung.<br />
Schließlich wird doch der Scope bei jedem Schleifendurchlauf neu betreten und verlassen.</p>
<p>Der Standard definiert es trefflich:</p>
<blockquote>
<p>The <code>for</code> statement<br />
for ( for-init-statement condition<sub>opt</sub> ; expression<sub>opt</sub> ) statement<br />
is equivalent to</p>
<pre><code>{
    for-init-statement
    while ( condition ) {
        statement
        expression ;
    }
}
</code></pre>
<p>except that names declared in the <em>for-init-statement</em> are in the same declarative-region as those declared in the condition, and except that a <code>continue</code> in statement (not enclosed in another iteration statement) will execute expression before re-evaluating <em>condition</em>.</p>
</blockquote>
<p>Wobei hier <em>statement</em> auch ein compound-statement sein kann, also mehrere Statements eingeschlossen in <code>{</code> und <code>}</code> .</p>
<blockquote>
<p>Wird hier das &quot;i&quot; nach jedem Schleifendurchlauf von for_aussen() zerstört und wieder erzeugt???</p>
</blockquote>
<p>Nein, <code>i</code> wird (genau wie oben) in jedem Betreten des Schleifenrumps erzeugt und zerstört.</p>
<blockquote>
<p>Und verhalten sich Referenzen identisch dazu?</p>
</blockquote>
<p>Oben genanntes gilt genauso für Referenzen.</p>
<blockquote>
<p>Also zB. alle Variablen schon außerhalb einrichten...?!</p>
</blockquote>
<p>Nein, gerade <strong>das</strong> solltest du vermeiden! Alle Variablen so lokal wie möglich deklarieren.</p>
<blockquote>
<p>PS. ...Sorry für den unformattieren Code, besser gings hier nicht..</p>
</blockquote>
<p>Nächtes mal die C++-Tags verwenden, sonst war alles in Ordnung.</p>
<p>Edit: Interessant. Wenn ich das C++-Code-Tag in ein italic-Tag-Paar packe, dann kommt nur <em>[code]</em> dabei raus! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405445</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 24 Jun 2014 19:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 20:20:26 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich danke euch! ...Auch gut zu wissen, wie die for-Schleife intern aussieht.<br />
(Vllt. noch dazu: Gibt es eigentlich noch mehr Funktionen der Form &quot;funkxy(;;;)&quot;, also mit &quot;;&quot;, und kann ich mir die auch selbst machen ??)</p>
<p>Ich dachte, dass für die Körper-Vars gleiches wie für die Kopf-Vars gelten würde (mal davon abgesehen, dass da eigentlich &quot;{}&quot; die Vars einschließen)...<br />
Ist das denn nicht allgemein unpraktisch/ungeschickt, etwas nach jedem Schleifendurchlauf zu vernichten, wenn es im nächsten wieder erzeugt wird??<br />
Also in Sachen Syntax und Objektorientierung kann ich das ja noch nachvolliehen, aber der Rechner hat dadurch doch mehr Arbeit, oder nicht?<br />
..Wenn sonst nicht viel in der Schleife passiert, könnte das Erzeugen/Vernichten schon ins Gewicht fallen, denke ich mal..</p>
<p>Ich bekomme es, wie gesagt, leider nicht mehr auf die Reihe, aber in dem Code mit der Referenz, war es eben gerade das Problem, dass man die Referenz nicht außerhalb erstellen konnte (...glaube ich...).</p>
<p>Wenn ich möglichst schnellen Code haben möchte, und mal angenommen, Variablen für Nichts zu zerstören und zu erzeugen dauert tatsächlich länger, welche Alternativen dazu habe ich denn?? ...Und falls es welche gibt, welche ist dann wirklich die schnellste Möglichkeit...??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405460</guid><dc:creator><![CDATA[Klon457]]></dc:creator><pubDate>Tue, 24 Jun 2014 20:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 21:50:10 GMT]]></title><description><![CDATA[<p>Würde mich jetzt auch mal interessieren. Aber ich denke, dass mit Vernichten in diesem Fall gemeint ist, dass der Speicher in dem der Wert der Schleifenvariable steht einfach überschrieben wird. Dann wird der alte gespeicherte Wert ja praktisch auch vernichtet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405473</guid><dc:creator><![CDATA[Thilo87]]></dc:creator><pubDate>Tue, 24 Jun 2014 21:50:10 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Tue, 24 Jun 2014 23:13:45 GMT]]></title><description><![CDATA[<p>Das &quot;Erzeugen&quot; von Variablen braucht keine Zeit, wenn keine Initialisierung erfolgt. Es gibt nämlich gar keinen Erzeugungsvorgang. Ohne Optimierung ist eine Variable im letztlich erzeugten Code nur noch eine Speicheradresse (und in optimierten Code oft noch nicht einmal das). Überall, wo diese Variable benutzt wird, steht dann eben fest diese Speicheradresse im Maschinencode. Diese Speicheradresse muss zur Laufzeit aber nicht erzeugt werden, die sitzt ja schon fest in der Hardware des Rechners.<br />
Gleiches gilt für das Zerstören von Variablen, wenn sie den Scope verlassen. Sofern da kein expliziter Destruktoraufruf erfolgt, sind die Kosten 0. Verlassen des Gültigkeitsbereichs heißt einfach nur, dass diese Speicheradresse ab diesem Punkt für den Compiler wieder frei ist zur Benutzung als eine andere Variable.</p>
<p>Das ändert sich, wenn die Variable irgendwie initialisiert werden muss. Falls die Initialisierung auch vorher gemacht werden könnte, dann ist dies tatsächlich ein Fall, in dem man die Variable aus der Schleife ziehen kann und sollte. Bei einfachen Initialisierungen, die für den Compiler sichtbar sind, kann der Compiler diesen Vorgang in der Regel auch optimieren und die Variableninitialisierung selber rausziehen.<br />
Extrembeispiel für eine unnötige, teure Initialisierung, die nicht automatisch optimiert werden kann:</p>
<pre><code>for (char a = 0; a &lt; 255; ++a)
{
  ofstream out(&quot;foo.bar&quot;);
  out &lt;&lt; a;
}
</code></pre>
<p>Das out zieht man besser raus. Aber:</p>
<pre><code>for (char a = 0; a &lt; 255; ++a)
{
  double d = sin(a);
  cout &lt;&lt; d;
}
</code></pre>
<p>Absolut keine Kosten für das d.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405481</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 24 Jun 2014 23:13:45 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Wed, 25 Jun 2014 09:12:43 GMT]]></title><description><![CDATA[<p>Klon457 schrieb:</p>
<blockquote>
<p>Auch gut zu wissen, wie die for-Schleife intern aussieht.<br />
(Vllt. noch dazu: Gibt es eigentlich noch mehr Funktionen der Form &quot;funkxy(;;;)&quot;, also mit &quot;;&quot;, und kann ich mir die auch selbst machen ??)</p>
</blockquote>
<p>Die sieht nicht intern so aus, sondern ist nur äquivalent dazu. Selbst machen kannst du dir sowas indem du eine eigene Programmiersprache entwickelst (und dazu einen Compiler).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405521</guid><dc:creator><![CDATA[oenone]]></dc:creator><pubDate>Wed, 25 Jun 2014 09:12:43 GMT</pubDate></item><item><title><![CDATA[Reply to Gültigkeitsbereich einer Referenz&#x2F;Variablen bei Mahrfachschleifen on Wed, 25 Jun 2014 13:31:08 GMT]]></title><description><![CDATA[<p>Intern - d.h. auf Assembler - sieht die eher so aus:</p>
<pre><code>init;
start:
 if (!cond)
   goto end;
 stmt;
 expr;
 goto start;
end:
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405560</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 25 Jun 2014 13:31:08 GMT</pubDate></item></channel></rss>