Ausführungsreihenfolge für ein if mit mehreren Bedingungen
Lesezeit: 3 Minuten
mrks
Wird in einer if-Anweisung mit mehreren Bedingungen die zweite Bedingung ausgeführt, wenn das Ergebnis der ersten eindeutig ist?
Beispiel:
if(i>0 && array[i]==0){
}
Wenn ich die Bedingungen vertausche, kann ein Segfault für negative Werte von i auftreten, aber auf diese Weise tritt kein Segfault auf. Kann ich sicher sein, dass dies immer funktioniert oder muss ich verschachtelte if-Anweisungen verwenden?
Siehe stackoverflow.com/questions/628526/…
– anon
16. März 2010 um 16:25 Uhr
Uri
Diese Art der Auswertung nennt man kurzschließen. Sobald das Ergebnis zu 100 % eindeutig ist, wird die Auswertung nicht fortgesetzt.
Dies ist eigentlich eine gängige Programmiertechnik. In C++ sehen Sie beispielsweise oft etwas wie:
if (pX!=null && pX->predicate()) { bla bla bla }
Wenn Sie die Reihenfolge der Bedingungen geändert haben, könnten Sie eine Methode auf einem Nullzeiger aufrufen und abstürzen. Ein ähnliches Beispiel in C würde das Feld einer Struktur verwenden, wenn Sie einen Zeiger auf diese Struktur haben.
Sie könnten etwas Ähnliches mit oder tun:
if(px==null || pX->isEmpty()} { bla bla bla }
Dies ist auch einer der Gründe, warum es im Allgemeinen eine gute Idee ist, Nebenwirkungen in einer if-Bedingung zu vermeiden.
Angenommen, Sie haben:
if(x==4 && (++y>7) && z==9)
Wenn x ist 4dann y wird unabhängig vom Wert von inkrementiert z oder ydoch wenn x ist nicht 4es wird überhaupt nicht erhöht.
+1. Erwähnenswert ist, dass eine Ausnahme von Nebenwirkungen in einer if-Bedingung die Überprüfung auf Fehlerrückgabewerte ist: if (function_that_returns_neg_on_error(param1, param2) < 0) { perror("function"); return -1;}
– Gauthier
21. März 2016 um 13:53 Uhr
Johannes Bode
Die Betreiber && und || garantieren, dass der Ausdruck auf der linken Seite vollständig ausgewertet wird (und alle Seiteneffekte angewendet werden), bevor die rechte Seite ausgewertet wird. Mit anderen Worten, die Operatoren führen einen Sequenzpunkt ein.
Wenn der Wert des Ausdrucks aus lhs bestimmt werden kann, wird rhs außerdem nicht ausgewertet. Mit anderen Worten, wenn Sie einen Ausdruck wie haben x && yund x wird als 0 (falsch) ausgewertet, dann ist der Wert des Ausdrucks unabhängig von y falsch, sodass y nicht ausgewertet wird.
Das bedeutet, dass Ausdrücke wie x++ && x++ sind wohldefiniert, da && führt einen Sequenzpunkt ein.
Shiplu Mokadim
Aus dem Entwurf 3485 (n3485.pdf) ist klar gesagt, dass
Die && Operatorgruppen links nach rechts. Die Operanden werden beide kontextuell in bool konvertiert (Klausel 4). Das Ergebnis ist wahr, wenn beide Operanden wahr sind, andernfalls falsch. Nicht wie &, && garantiert eine Auswertung von links nach rechts: Der zweite Operand wird nicht ausgewertet, wenn der erste Operand falsch ist.
Das Ergebnis ist ein boolescher Wert. Wenn der zweite Ausdruck ausgewertet wird, wird jede Wertberechnung und Nebenwirkung, die dem ersten Ausdruck zugeordnet ist, vor jeder Wertberechnung und Nebenwirkung, die dem zweiten Ausdruck zugeordnet ist, sequenziert.
was meinst du mit ungleich &? Wenn ich & verwende, ist die Bestellung nicht garantiert?
– AlphaGoku
23. September 2019 um 9:07 Uhr
Bsp.: if((func1() & func2()) == true) vs if(func1() && func2())
– AlphaGoku
23. September 2019 um 9:18 Uhr
14167400cookie-checkAusführungsreihenfolge für ein if mit mehreren Bedingungenyes
Siehe stackoverflow.com/questions/628526/…
– anon
16. März 2010 um 16:25 Uhr