Grundsatzfrage Vergleich bei While

Gast #2536476
Lesenswert?

Manfred Schreier schrieb:
> while(!(TWCR & (1<<TWINT) && )foo());

Sollte das eher so sein:
while(!(TWCR & (1<<TWINT) && foo()));

Das logische UND wird den zweiten Ausdruck nicht auswerten, wenn der 
erste schon false ergibt. Wenn also "!(TWCR & (1<<TWINT)" schon false 
ist, wird foo() micht mehr ausgewertet, und damit auch nicht aufgerufen.
#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
Gast #2536497
Lesenswert?

foo() soll ein Flag überprüfen, das sozusagen mein Funktions Watchdog 
ist falls !(TWCR & (1<<TWINT) nie false wird.

Hab es aber noch nicht aus gerreift, da ich ein Binar timeslice schedule 
habe und der timer für meinen funktions WD schießt mir die ISR der 
TSlice zusammen :(
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