Keine Zuweisung?

Hallo,

bin beim C+±Lernen… da ist folgendes Beispiel im Buch (Ausschnitt):

bool erg = false;
int y = 5;
erg = 7 || (y = 0);

warum ist hinterher y = 5 und nicht 0 - das ist doch eindeutig eine Zuweisung?! Oder gilt das hier nicht? Warum?

Danke,
Christof

bool erg = false;
int y = 5;
erg = 7 || (y = 0);

warum ist hinterher y = 5 und nicht 0 - das ist doch
eine Zuweisung?! Oder gilt das hier nicht? Warum?

Ich denke der Autor des Buches dachte in diesem Fall an
einen sogenannten ShortCircuit (Kurzschluss), so heißen
die Dinger zumindest in Perl.
D.h. bei einem oder (||) wird der zweite Teil des
Ausdruckes nur ausgewertet, wenn der erste false ist,
da sonst das Ergebnis ja bereits feststeht.
Aber Achtung! Diese Verhalten ist laut Stroustrup nicht
garantiert, d.h. der Compiler könnte auch erst y=0 und
dann erg=7 Auswerten. Das Buch macht hier also einen
Fehler, da die Abarbeitungsreihenfolge nicht garantiert
ist.

Gruß Ben

Hallo,

bin beim C+±Lernen… da ist folgendes Beispiel im Buch
(Ausschnitt):

bool erg = false;
int y = 5;
erg = 7 || (y = 0);

warum ist hinterher y = 5 und nicht 0 - das ist doch eindeutig
eine Zuweisung?! Oder gilt das hier nicht? Warum?

Es wird ein logischer ODER-Ausdruck verwendet. Der C++ Compiler erkennt nach dem ersten Teil ( 7 => true ), daß dieser Ausdruck völlig unabhängig vom zweiten Teil immer true sein wird. Folglich spart er sich den zweiten Teil. Wenn du die Operanden vertauscht, wird y verändert.
Diese Optimierung macht der Compiler übrigens von Haus aus, das hat nichts mit optimierenden Compiler-Optionen zu tun.

Markus

D.h. bei einem oder (||) wird der zweite Teil des
Ausdruckes nur ausgewertet, wenn der erste false ist,
da sonst das Ergebnis ja bereits feststeht.
Aber Achtung! Diese Verhalten ist laut Stroustrup
nicht
garantiert, d.h. der Compiler könnte auch erst y=0 und
dann erg=7 Auswerten.

Korrektur, da hat sich wohl bei mir etwas hartnäckig
falsch eingeprägt - habe gerade noch einmal
nachgelesen:
, && und || werden von links nach rechts ausgewertet
und bei && wird die rechte Seite nur ausgewertet wenn
die linke true liefert, bei || nur wenn die linke false
liefert.

Das Buch macht hier also einen
Fehler, da die Abarbeitungsreihenfolge nicht
garantiert
ist.

Das Buch ist folglich korrekt.

Gruß Ben

Aha - danke euch beiden, das ist logisch und erklärt es, ist aber im buch mit keinem Wort erwähnt :frowning:

Danke nochmals!

Christof