Ausführungsreihenfolge für ein if mit mehreren Bedingungen

Lesezeit: 3 Minuten

Benutzeravatar von mrks
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

Benutzeravatar von Uri
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

Benutzeravatar von John Bode
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.

Benutzeravatar von Shiplu Mokaddim
Shiplu Mokadim

Aus dem Entwurf 3485 (n3485.pdf) ist klar gesagt, dass

5.14 Logischer UND-Operator [expr.log.and]

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
  1. 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.
  2. 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

1416740cookie-checkAusführungsreihenfolge für ein if mit mehreren Bedingungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy