Frage

nehmen Lassen Sie uns ein einfaches Beispiel eines Objekts Cat. Ich möchte sicher, dass das „nicht null“ sein cat ist orange oder grau.

if(cat != null && cat.getColor() == "orange" || cat.getColor() == "grey") {
//do stuff
}

Ich glaube und kommt zuerst, dann die OR. Ich bin ein bisschen unscharf obwohl, so hier sind meine Fragen:

  1. Kann jemand gehen mir durch diese Aussage so bin ich sicher, dass ich bekommen, was passiert?

  2. Auch, was passiert, wenn ich Klammern hinzuzufügen; Wird diese Änderung der Reihenfolge der Operationen?

  3. Wird meine Reihenfolge der Operationen von Sprache zu Sprache ändern?

War es hilfreich?

Lösung

Die Java-Tutorials hat eine Liste zeigt Operator Vorrang . Die Gleichstellung der Betreiber zuerst ausgewertet werden, dann &&, dann ||. Klammern werden vor allem anderen ausgewertet werden, um sie so das Hinzufügen der Reihenfolge ändern kann. Dies ist in der Regel ziemlich das gleiche von Sprache zu Sprache, aber es ist immer eine gute Idee zu überprüfen.

Es sind die kleinen Variationen im Verhalten, dass Sie erwarten nicht, dass dazu führen, können Sie einen ganzen Tag Debuggen zu verbringen, so ist es eine gute Idee ist, die Klammern an seinem Platz zu setzen, so dass Sie sicher sind, was die Reihenfolge der Auswertung sein.

Andere Tipps

Boolean Reihenfolge der Operationen (in allen Sprachen glaube ich):

  1. parens
  2. NOT
  3. und
  4. ODER

So Ihre Logik oben entspricht:

(cat != null && cat.getColor() == "orange") || cat.getColor() == "grey"

Der Ausdruck ist im Grunde identisch mit:

if ( (cat != null && cat.getColor() == "orange") || cat.getColor() == "grey") {
  ...
}

Die Rangordnung ist hier, dass AND (&&) eine höhere Priorität hat als OR (||).

Sie sollten auch wissen, dass die Verwendung von == zu Test für String Gleichheit wird manchmal Arbeit in Java, aber es ist nicht, wie Sie es tun sollten. Sie sollten tun:

if (cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
  ...
}

dh verwenden Sie die equals() Methoden für String Vergleich, == nicht, die einfach Referenz Gleichheit der Fall ist. Referenz Gleichheit für Strings können irreführend sein. Zum Beispiel:

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b); // false

Ja && wird auf jeden Fall vor || ausgewertet. Aber ich sehe, Sie tun cat.getColor() == "orange", die Sie unerwartetes Ergebnis geben könnte. Vielleicht möchten Sie diese stattdessen:

if(cat != null && ("orange".equals(cat.getColor()) || "grey".equals(cat.getColor()))) {
    //do stuff
}

Zuerst Ihre if-Anweisung enthält drei Haupt Ausdrücke:

  1. cat! = Null
  2. cat.getColor () == "orange"
  3. cat.getColor () == "grau"

Der erste Ausdruck einfach überprüft, ob Katze nicht null ist. Sein notwendig ansonsten der der zweite Ausdruck wird erhalten ausgeführt und in einem NPE(null pointer excpetion) führen. Deshalb ist die Verwendung von && zwischen dem ersten und dem zweiten Ausdruck. Wenn Sie && verwenden, wenn der erste Ausdruck ergibt falschen den zweiten Ausdruck wird nie ausgeführt. Schließlich, ob Sie überprüfen die Farbe der Katze grau ist.

  

Schließlich ist zu beachten, dass Ihre if-Anweisung   noch falsch , denn wenn Katze   null, der dritte Ausdruck ist noch   ausgeführt und Sie somit eine null erhalten   Zeiger Ausnahme .

Der richtige Weg, es zu tun ist:

if(cat != null && (cat.getColor() == "orange" || cat.getColor() == "grey")) { 
//do stuff 
} 

Überprüfen Sie die Reihenfolge der Klammer.

Reihenfolge der Operation ist nicht das, was Sie benötigen, müssen Sie Boolesche Algebra, diese Booleschen Funktionen enthält. Maxterms / Minterme, Gray-Code, Karnaugh Tabellen, Dioden, Transistoren, logische Gatter, Multiplexer, bitadders, Flip-Flops ... Was Sie wollen, ist boolean „Logik“ auf Computern oder virtuellen Maschinen zu implementieren. Mit „Reihenfolge der Vorgänge“ Sie etwas über die Physik wie die Verwaltung von Verzögerungen auf Logikgatter beziehen (OR, if) Nanosekunden-Intervalle?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top