Grundsatzfrage Vergleich bei While

Gast #2536476
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.
#2536479
Mal angenommen, die Klammer im zweiten Beispiel wäre korrekt gesetzt, 
wird bei Booleschen Operatoren in C nur soweit ausgewertet, bis das 
Ergebnis feststeht. Falls TWCR & (1<<TWINT) unwahr ist, wird die zweite 
Hälfte einer Und-Verknüpfung nicht ausgeführt.

Stichwort "short circuit operator".
#2536484
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.