Abarbeitung der Operatoren && und ||

Neulich kam die Frage auf ob in der Sprache C festgelegt ist, dass die Verkettungen mit && oder || von links her abgearbeitet werden und abgebrochen wird sobald die weitere Auswertung sinnlos ist.
Ist das so definiert?
und wie siehts in Java aus?

Ich verlasse mich da relativ oft darauf, z.b. versuche ich zur Zeit mit:

boolean success = true;
success = funktion() && success;

rauszufinden ob die funktion() jemals schiefging. Es scheint zu gehen, wenn er aber z.b. von rechts her auswerten würde, würde er gar nicht mehr nach funktion() reingehen, nach dem ersten Fehler.

In Scriptsprachen wie Perl etc. sieht man ja auch oft:
tuirgendwas() || error…;

Bruno

Hi Bruno :wink:))

Neulich kam die Frage auf ob in der Sprache C festgelegt ist,
dass die Verkettungen mit && oder || von links her
abgearbeitet werden und abgebrochen wird sobald die weitere
Auswertung sinnlos ist.
Ist das so definiert?

Ja!!! Das ist tatsächlich so. Wenn du z.B. ein Feld „int a[100]“ definierst hast, dann kommen oft Abfragen in der Form:

if (i…) …

Wenn jetzt i=100 ist und a[i] noch ausgewertet würde, würdest du einen Seitenfehler (segmentation fault) verursachen! Gleiches würde passieren, wenn von rechts nach links ausgewertet würde. Außerdem ist es schneller so …

Wenn du unbedingt beide Seiten auswerten möchtest, dann kannst du && durch * und || durch + ersetzen, also etwa

if ( (i…) ) …

und wie siehts in Java aus?

Dasselbe …

Ich verlasse mich da relativ oft darauf, z.b. versuche ich zur
Zeit mit:

boolean success = true;
success = funktion() && success;

rauszufinden ob die funktion() jemals schiefging.

Klar geht das :wink:))

cu Stefan.

Zur Ergänzung: Es ist in der Sprachdefinition so definiert (s. Kernighan/Ritchie oder bspw. http://www.informatik.fh-muenchen.de/~schieder/progr…)
Gruß

J.