Grundsatzfrage Vergleich bei While

Gast #2536463
Lesenswert?

hi,

Ich verstehe etwas nicht und vielleicht kann mir jemand auf die Sprünge 
helfen.

Warum wird so;

  while(foo() && !(TWCR & (1<<TWINT)));

die Funktion foo() ausgeführt.
Und so ;

  while(!(TWCR & (1<<TWINT) && )foo());

nicht ??
danke
#2536484
Lesenswert?

Es ist generell gefährlich in logischen Ausdrücken Funktionen aufzurufen 
die noch mehr tun als nur einen Wert für den Ausdruck selbst zu 
ermitteln.
Generell werden logische Ausdrücke nur soweit ausgewertet bis das 
Ergebnis feststeht.
Das heisst:
Bei einem "oder" (or) wird der 2. Ausdruck nur dann garantiert 
ausgewertet wenn der Erste false ist
Bei einem "und" (and) wirde der 2. Ausdruck nur dann garantiert 
ausgewertet wenn der Erste true ist.

Deswegen goldene Regel:
Erst Funktionen aufrufen die etwas berechnen oder Anderes tun das später 
noch gebraucht wird
Erst dann den logischen Ausdruck auswerten.
Ist auch übersichtlicher
Moderator Persönliche Seite #2536550
Lesenswert?

Udo Schmitt schrieb:
> Es ist generell gefährlich in logischen Ausdrücken Funktionen aufzurufen
> die noch mehr tun als nur einen Wert für den Ausdruck selbst zu
> ermitteln.

Wenn man damit umzugehen weiß, ist es überhaupt nicht gefährlich, 
sondern sehr nützlich. Man spart sich damit überflüssige bzw. ungewollte 
Funktionsaufrufe.
Gast #2536624
Lesenswert?

Udo Schmitt schrieb:
> Bei einem "oder" (or) wird der 2. Ausdruck nur dann garantiert
> ausgewertet wenn der Erste false ist
> Bei einem "und" (and) wirde der 2. Ausdruck nur dann garantiert
> ausgewertet wenn der Erste true ist.

Lasse das "garantiert" weg. Der 2.Ausdruck wird ausschließlich in den 
oben genannten Fällen ausgewertet und sonst nicht. Darauf kann man sich 
verlassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren