2013-05-17 4 views
21

Okay, also habe ich dieses Stück Code getestet und ich habe festgestellt, dass es keine Ausnahme gibt.Zwei Bedingungen in einer if-Anweisung macht die zweite Sache, wenn die erste falsch ist?

public static void main(String[] args) { 
    int[] list = {1,2}; 
    if (list.length>2 && list[3] == 2){ 
     System.out.println(list[1]); 
    } 
} 

Ist die Aussage hier

if (list.length>2 && list[3] == 2) 

bedeutet, dass, wenn die erste Bedingung, die wir nicht einmal die zweite Bedingung falsch ist zu überprüfen?

Oder es gleich zu

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

?

Und was ist, wenn es in C oder Python oder einigen anderen Sprachen geschrieben ist?

Danke

+1

Ihre 2 Wege sind gleich –

+2

Java folgt http://en.wikipedia.org/wiki/Short-circuit_evaluation (Kurzschlussauswertung), um diesen Ausdruck zu validieren – Vasu

+1

Kurzschlussauswertung können Sie Bedingungen bewerten, die nur so lange legal sein werden als erste Bedingung ist legal. Du wirst oft Code wie 'if (string! = Null && string.length> 5) sehen' –

Antwort

39

Es ist üblich, Sprachen (Java und Python unter ihnen sind) false das erste Argument einer logischen AND und beenden Auswertung der Aussage, wenn das erste Argument zu bewerten. Dies liegt daran:

Von The Order of Evaluation of Logic Operators,

Wenn Java den Ausdruck d wertet = b & & c ;, es zuerst überprüft, ob b wahr ist.Hier ist b falsch, also b & & c muss falsch sein, unabhängig davon, ob c stimmt oder nicht, also überprüft Java den Wert von c nicht.

Dies ist bekannt als short-circuit evaluation, und wird auch in der Java docs bezeichnet.

Es ist üblich, list.count > 0 && list[0] == "Something" zu sehen, um ein Listenelement zu überprüfen, falls es existiert.


Es ist auch erwähnenswert, dass if (list.length>2 && list[3] == 2) ist nicht gleich dem zweiten Fall

if (list.length>2){ 
    if (list[3] == 2){ 
     ... 
    } 
} 

, wenn es eine else ist danach. Die else gilt nur für die if-Anweisung, an die sie angehängt ist.

Um dies zu demonstrieren gotcha:

if (x.kind.equals("Human")) { 
    if (x.name.equals("Jordan")) { 
     System.out.println("Hello Jordan!"); 
    } 
} else { 
    System.out.println("You are not a human!"); 
} 

wird wie erwartet, aber

if (x.kind.equals("Human") && x.name.equals("Jordan")) { 
    System.out.println("Hello Jordan!"); 
} else { 
    System.out.println("You are not a human!"); 
} 

wird auch jeder Mensch sagen, wer nicht Jordan sie Menschen sind nicht ist.

+1

Der letzte Block ist fair. Nur Jordanien kann die Welt regieren. – TheBrenny

+0

Bitweise Operatoren von Python ('&', '|') ** unterstützen keine Kurzschlüsse. Die folgenden Operatoren von Python ** tun ** jedoch: 'and',' or', 'any',' all' – anilbey

14

Ja. Wenn die erste Bedingung nicht erfüllt ist, wird der Rest nicht ausgewertet. Dies ist bekannt als Kurzschluss. Weitere Informationen finden Sie unter here. Beachten Sie, dass dies nicht für Java gilt und viele andere Sprachen dasselbe tun.

4

Ja, beide Nutzungen sind semantisch äquivalent ... Das heißt, wenn die Länge> 2 ist, darf der Code mehr als das zweite Element zugreifen.

Im ersten Fall, was zählt, ist der && Operator, daran zu denken als: Wenn erste Bedingung dann gelten zweite Bedingung erfüllt ist.

Der nachfolgende Zustand hat auch eine implizite "und dann" Klausel

if length greater than two 
then access third element 
6

Von javadoc:

Die Bedingte Operatoren

Die & & und || Operatoren führen Conditional-AND und Conditional-OR Operationen für zwei boolesche Ausdrücke aus. Diese Operatoren zeigen "Kurzschlussverhalten", was bedeutet, dass der zweite Operand nur bei Bedarf ausgewertet wird.

& & Bedingungs-UND || Conditional-OR

3

Wenn die erste Bedingung falsch ist, dann überprüfen Sie es gewohnt für die zweite Bedingung als etwas & & F = F wieder hängt es die weise Operationsbit Sie tun. wie im Falle von OR (||) wenn die erste Bedingung wahr (T) ist, wird sie nicht als zweite Bedingung überprüft T = T, aber wenn es falsch ist (F), dann wird es definitiv nach der Sekunde prüfen

3

Sie haben in Ihrer IF-Anweisung angegeben, dass beide Bedingungen erfüllt sein müssen, damit System.out.println ausgeführt werden kann. Wenn also die erste Bedingung selbst fehlschlägt, wird die zweite Bedingung nicht überprüft (dies ist für AND-Operator). Die zweite Bedingung wird jedoch überprüft, wenn Sie in der If-Anweisung OR-Operator angegeben haben.