<?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[logische Verständnisfrage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe hier eine Übungsaufgabe in einem Buch. Sie sieht wie folgt aus:</p>
<pre><code class="language-cpp">cout &lt;&lt; boolalpha;

bool erg = false;

int a, b, c;

a = b = c = 0;

erg = ++a || ++b &amp;&amp; ++c;

cout &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;  erg = &quot; &lt;&lt; erg &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    a = &quot; &lt;&lt; a   &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    b = &quot; &lt;&lt; b   &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    c = &quot; &lt;&lt; c   &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Die Ausgabe ist:</p>
<p>erg = true<br />
a = 1<br />
b = 0<br />
c = 0</p>
<p>Ich verstehe diese Ausgabe nicht wirklich. Es wird ja das a inkrementiert, also hat es jetzt den Wert &quot;1&quot;, ja. Mich wundert es nur, warum b und c nicht auch &quot;1&quot; sind, da sie ja auch inkrementiert werden?</p>
<p>Oder ist es so, dass es b und c nicht inkrementiert da schon beim ++a der Wert &quot;true&quot; geliefert wird, da ja schon eine Bedingung erfüllt ist, da es ja ODER ist und nicht UND?</p>
<p>So würde ich mir das jetzt erklären...</p>
<p>Könnt ihr mir nen Denkstoß geben?</p>
<p>Danke im Voraus!</p>
<p>Gruß nki</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155121/logische-verständnisfrage</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 04:29:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155121.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Aug 2006 20:33:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 20:34:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe hier eine Übungsaufgabe in einem Buch. Sie sieht wie folgt aus:</p>
<pre><code class="language-cpp">cout &lt;&lt; boolalpha;

bool erg = false;

int a, b, c;

a = b = c = 0;

erg = ++a || ++b &amp;&amp; ++c;

cout &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;  erg = &quot; &lt;&lt; erg &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    a = &quot; &lt;&lt; a   &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    b = &quot; &lt;&lt; b   &lt;&lt; &quot;\n&quot;
     &lt;&lt; &quot;    c = &quot; &lt;&lt; c   &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Die Ausgabe ist:</p>
<p>erg = true<br />
a = 1<br />
b = 0<br />
c = 0</p>
<p>Ich verstehe diese Ausgabe nicht wirklich. Es wird ja das a inkrementiert, also hat es jetzt den Wert &quot;1&quot;, ja. Mich wundert es nur, warum b und c nicht auch &quot;1&quot; sind, da sie ja auch inkrementiert werden?</p>
<p>Oder ist es so, dass es b und c nicht inkrementiert da schon beim ++a der Wert &quot;true&quot; geliefert wird, da ja schon eine Bedingung erfüllt ist, da es ja ODER ist und nicht UND?</p>
<p>So würde ich mir das jetzt erklären...</p>
<p>Könnt ihr mir nen Denkstoß geben?</p>
<p>Danke im Voraus!</p>
<p>Gruß nki</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109528</guid><dc:creator><![CDATA[nki]]></dc:creator><pubDate>Wed, 02 Aug 2006 20:34:48 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 20:43:32 GMT]]></title><description><![CDATA[<p>Also diese Zeile wird von links nach rechts abgearbeitet</p>
<pre><code class="language-cpp">erg = ++a || ++b &amp;&amp; ++c;
</code></pre>
<p>Und es wird früh möglichst abgebrochen. Nachdem ++a schon true ergibt ( &gt; 0 entspricht true) wird der rest nicht mehr ausgeführt weil da ein oder dannach kommt.</p>
<p>Wäre das so:</p>
<pre><code class="language-cpp">erg = ++a &amp;&amp; ++b || ++c;
</code></pre>
<p>Wäre das ergebnis das a und b 1 sind und c 0.</p>
<p>Ich hoffe das erklärt es einigermaßen.</p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109533</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 02 Aug 2006 20:43:32 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 20:44:29 GMT]]></title><description><![CDATA[<p>die eingebauten operatoren &amp;&amp; und || führen eine sog. kurzschlussauswertung aus: wenn das ergbenis durch den linken operanden bereits bestimmt ist, so wird der rechte operand nicht ausgewertet. das ist im übrigen der grund, warum diese operatoren nicht überladen werden sollten - denn ein überladener operantor ist eine normale funktion, die den üblichen regeln des funktions aufrufs unterliegt (alle operanden werden ausgewertet <em>bevor</em> die funktion aufgerufen wird), es ist nicht möglich, dieses kurzschlussverhalten für eigene operatoren zu erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109534</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 02 Aug 2006 20:44:29 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 20:45:43 GMT]]></title><description><![CDATA[<p>nki schrieb:</p>
<blockquote>
<p>Oder ist es so, dass es b und c nicht inkrementiert da schon beim ++a der Wert &quot;true&quot; geliefert wird, da ja schon eine Bedingung erfüllt ist, da es ja ODER ist und nicht UND?</p>
</blockquote>
<p>Diese Frage ist die Antwort! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109535</guid><dc:creator><![CDATA[haase]]></dc:creator><pubDate>Wed, 02 Aug 2006 20:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 20:50:14 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>die eingebauten operatoren &amp;&amp; und || führen eine sog. kurzschlussauswertung aus: wenn das ergbenis durch den linken operanden bereits bestimmt ist, so wird der rechte operand nicht ausgewertet. das ist im übrigen der grund, warum diese operatoren nicht überladen werden sollten - denn ein überladener operantor ist eine normale funktion, die den üblichen regeln des funktions aufrufs unterliegt (alle operanden werden ausgewertet <em>bevor</em> die funktion aufgerufen wird), es ist nicht möglich, dieses kurzschlussverhalten für eigene operatoren zu erhalten.</p>
</blockquote>
<p>Hmm wo steht, dass das nicht geht? (Der Abschnitt würde mich mal interessieren)<br />
Ich glaube das nämlich nicht so ganz.</p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109536</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 02 Aug 2006 20:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 21:09:15 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>die eingebauten operatoren &amp;&amp; und || führen eine sog. kurzschlussauswertung aus: wenn das ergbenis durch den linken operanden bereits bestimmt ist, so wird der rechte operand nicht ausgewertet. das ist im übrigen der grund, warum diese operatoren nicht überladen werden sollten - denn ein überladener operantor ist eine normale funktion, die den üblichen regeln des funktions aufrufs unterliegt (alle operanden werden ausgewertet <em>bevor</em> die funktion aufgerufen wird), es ist nicht möglich, dieses kurzschlussverhalten für eigene operatoren zu erhalten.</p>
</blockquote>
<p>Hmm wo steht, dass das nicht geht? (Der Abschnitt würde mich mal interessieren)<br />
Ich glaube das nämlich nicht so ganz.</p>
</blockquote>
<p>Das folgt direkt aus der Tatsache, dass ein Operator immer durch eine *Funktion* überladen wird (siehe 13.5). Und die Regeln für Funktionen besagen, dass immer alle Argumente ausgewertet werden (wobei die Reihenfolge nicht spezifiziert ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109549</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 02 Aug 2006 21:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 21:13:06 GMT]]></title><description><![CDATA[<p>Dankeschön für die Bestätigungen und für diese gerade laufende, interessante Diskussion <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109553</guid><dc:creator><![CDATA[nki]]></dc:creator><pubDate>Wed, 02 Aug 2006 21:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 21:37:11 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>evilissimo schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>die eingebauten operatoren &amp;&amp; und || führen eine sog. kurzschlussauswertung aus: wenn das ergbenis durch den linken operanden bereits bestimmt ist, so wird der rechte operand nicht ausgewertet. das ist im übrigen der grund, warum diese operatoren nicht überladen werden sollten - denn ein überladener operantor ist eine normale funktion, die den üblichen regeln des funktions aufrufs unterliegt (alle operanden werden ausgewertet <em>bevor</em> die funktion aufgerufen wird), es ist nicht möglich, dieses kurzschlussverhalten für eigene operatoren zu erhalten.</p>
</blockquote>
<p>Hmm wo steht, dass das nicht geht? (Der Abschnitt würde mich mal interessieren)<br />
Ich glaube das nämlich nicht so ganz.</p>
</blockquote>
<p>Das folgt direkt aus der Tatsache, dass ein Operator immer durch eine *Funktion* überladen wird (siehe 13.5). Und die Regeln für Funktionen besagen, dass immer alle Argumente ausgewertet werden (wobei die Reihenfolge nicht spezifiziert ist).</p>
</blockquote>
<p>Hmm vielleicht reden wir hier an einander vorbei.</p>
<p>Also das bei einem Funktionsaufruf erst einmal alles ausgewertet wird, ist mir ja klar.</p>
<p>Also z.B:</p>
<pre><code class="language-cpp">Foo(++a, b++, c++);
</code></pre>
<p>Aber ich meine soetwas:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct foo{
    foo():state(0){}
    foo &amp; operator++(){
        cout &lt;&lt; &quot;Ausgefuehrt ++op&quot; &lt;&lt; endl;
        ++state;
        return *this;
    }
    foo operator++(int){
        cout &lt;&lt; &quot;Ausgefuehrt op++&quot; &lt;&lt; endl;
        foo tmp = *this;
        ++state;
        return tmp;
    }
    operator bool(){
        return state &gt; 0;
    }
    unsigned get_state() const { return state; }
private:
    unsigned state;
};

int main(){
    foo f;
    cout &lt;&lt; &quot;State: &quot; &lt;&lt; f.get_state() &lt;&lt; endl;
    bool test = ++f || f++; // &lt;&lt;-- das
    cout &lt;&lt; &quot;State: &quot; &lt;&lt; f.get_state() &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Wenn das so ist wie ihr sagt müsste die Ausgabe folgende sein:</p>
<blockquote>
<p>State: 0<br />
Ausgefuehrt ++op<br />
Ausgefuehrt op++<br />
State: 2</p>
</blockquote>
<p>Aber tatsächlich bekomme ich:</p>
<blockquote>
<p>State: 0<br />
Ausgefuehrt ++op<br />
State: 1</p>
</blockquote>
<p>Reden wir aneinander vorbei, oder ist der g++ da nicht Standardkonform?</p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109567</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 02 Aug 2006 21:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 22:22:37 GMT]]></title><description><![CDATA[<p>Ich denke, die Standardkenner meinen die (potentielle) Überladung der Operatoren &amp;&amp; und ||, und nichts anderes <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/1109584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109584</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 02 Aug 2006 22:22:37 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Wed, 02 Aug 2006 23:26:43 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ich denke, die Standardkenner meinen die (potentielle) Überladung der Operatoren &amp;&amp; und ||, und nichts anderes <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>Das kann sein *g* Das wurde irgendwie nur so verallgemeinert für Operatoren dargestellt das ich das nicht so aufgefasst habe.</p>
<p>BR<br />
Vinzenz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1109591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109591</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Wed, 02 Aug 2006 23:26:43 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Thu, 03 Aug 2006 12:26:22 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Ich denke, die Standardkenner meinen die (potentielle) Überladung der Operatoren &amp;&amp; und ||, und nichts anderes <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>Genau die meinen wir.</p>
<p>Nochmal in campers Beitrag reingeschaut (Hervorhebung von mir)</p>
<p>camper schrieb:</p>
<blockquote>
<p>die eingebauten operatoren &amp;&amp; und || führen eine sog. kurzschlussauswertung aus: wenn das ergbenis durch den linken operanden bereits bestimmt ist, so wird der rechte operand nicht ausgewertet. das ist im übrigen der grund, warum <strong>diese</strong> operatoren nicht überladen werden sollten[...]</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1109874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1109874</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 03 Aug 2006 12:26:22 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Thu, 03 Aug 2006 14:56:06 GMT]]></title><description><![CDATA[<p>Hmm... <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>
<p>Man kann doch auch eine eigene Funktion mit &quot;Kurzschluss&quot; beenden oder nicht?</p>
<pre><code class="language-cpp">bool or( int a, int b ) {
    if( a )
        return true;     // Funktion wird beendet, wenn a != 0 ist
    if( b )
        return true;
    if( a &amp;&amp; b )
        return true;
    return false;
}
</code></pre>
<p>Oder hab ich da was falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110007</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Thu, 03 Aug 2006 14:56:06 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Thu, 03 Aug 2006 15:00:05 GMT]]></title><description><![CDATA[<p>Ja sicher, aber zum Zeitpunkt des Funktionsablaufs stehen a und b schon fest und sind damit vollständig ausgewertet.</p>
<p>EDIT:</p>
<pre><code class="language-cpp">a &amp;&amp; a-&gt;x()
</code></pre>
<p>vs.</p>
<pre><code class="language-cpp">and(a, a-&gt;x())
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1110011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110011</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 03 Aug 2006 15:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Thu, 03 Aug 2006 15:07:48 GMT]]></title><description><![CDATA[<p>aso...ja stimmt, schuldigung</p>
<p>also sind dann bei</p>
<pre><code class="language-cpp">or( a++, b++ );
</code></pre>
<p>beide schon inkrementiert, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110020</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Thu, 03 Aug 2006 15:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to logische Verständnisfrage on Thu, 03 Aug 2006 16:11:51 GMT]]></title><description><![CDATA[<p>Richtig! Und das wäre bei den genannten Operatoren nicht das erwartete. Wenn ich z.B.</p>
<pre><code class="language-cpp">KomplexerTyp *t = 0;
if(t &amp;&amp; t-&gt;funktion())
</code></pre>
<p>würde ich nicht erwarten das versucht wird die Funktion aufzurufen (da der Pointer auf 0 gesetzt ist). Wenn das nun aber doch passiert, würde das Programm (vermutlich) wegknallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1110055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1110055</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 03 Aug 2006 16:11:51 GMT</pubDate></item></channel></rss>