Wie wird der Vorrang von '&&' und '||' durch CODING in Java?

8

Ich wusste von irgendwo, dass logisch und: '& amp; & amp;' hat eine höhere Priorität als logisch oder: '||' in Java. Und während der Programmierung mache ich selten Fehler auf ihnen. Aber bis jetzt habe ich keine Ahnung davon gefunden, wie diese Präzedenz wirklich funktioniert? Was würde passieren, wenn ich nicht über den Vorrang der beiden wüsste und welchen Fehler ich machen würde? Ich habe versucht, einen Code zu schreiben, um den Vorrang von "& amp; & amp;" und "||" aber gescheitert, zum Beispiel:

%Vor%

Der obige Code würde unabhängig von der Priorität von "& amp; & amp;" und "||", das heißt 'falsch || falsch & amp; & amp; wahr || false 'ergibt false, unabhängig von der Priorität.

Also, mit anderen Worten, ich möchte eine Methode oder Funktion, die den Vorrang von "& amp; & amp;" und '||', sollte es unterschiedliche Ergebnisse ergeben, abhängig von der Priorität von '& amp; & amp;' und '||' ... Wie könnte diese Funktion hergestellt werden? Ist das möglich? Ich denke, es ist vielleicht eine schwierige Frage oder eine dramatisch einfache ... Vielleicht ist es kein Java-Problem, sondern etwas Mathe ... Alles in allem, jemand Hilfe? Danke.

    
pf_miles 14.12.2010, 06:55
quelle

8 Antworten

14

Nehmen wir Ihren Beispielausdruck:

%Vor%

Jetzt glauben wir, dass das wie folgt funktioniert:

%Vor%

richtig?

Nehmen wir an, das Gegenteil ist wahr, und es ist tatsächlich

%Vor%

Welche Werte von boolExp1 usw. würden uns andere Ergebnisse liefern?

Nun, nehmen wir:

%Vor%

Unter den "& amp; & amp; hat höhere Priorität" -Regeln wäre das Ergebnis wahr. Unter "|| hat Vorrangregeln" würde das Ergebnis falsch sein. Ein schneller Test zeigt jedoch, dass der Ausdruck wahr ist.

Natürlich beweist das nicht wirklich, dass & amp; & amp; hat höhere Priorität als || - nur das || hat keinen höheren Vorrang als & amp; & amp; Wir könnten überlegen, ob sie gleich Vorrang haben - und das mit anderen Ausdrücken auf ähnliche Weise testen ... einen Beispielausdruck und Werte finden, die unter verschiedenen Vorrangregeln unterschiedliche Ergebnisse ergeben, und diese testen.

Letztendlich bevorzuge ich jedoch:

  • Vertrauen Sie der Spezifikation, es sei denn, ich habe bestimmte Zweifel
  • Klammern verwenden, um meine Absichten klar zu machen

Ich würde nicht den ersten Ausdruck "wie er ist" verwenden ... denn wenn Sie nicht wirklich die Vorrangregeln kennen (und ich vermute, dass viele Java-Entwickler dies nicht tun - könnte ich nicht "Ich schwöre, ich hätte ..." und "Du hast recht") Du bist im Dunkeln. Es ist besser, es klar und deutlich zu machen, wo Zweifel bestehen.

    
Jon Skeet 14.12.2010, 06:59
quelle
5

Wenn && keine höhere Priorität als || hat, dann ist dieser Ausdruck:

%Vor%

würde so bewertet werden:

%Vor%

Um zu überprüfen, ob dies der Fall ist oder nicht, Sie können alle Kombinationen von a , b und c generieren. und vergleichen Sie das Ergebnis dieser beiden Ausdrücke, um zu sehen, ob sie immer gleich sind oder nicht, das heißt:

  1. Für alle Kombinationen von a , b und c
  2. Überprüfen Sie Folgendes: (a || b && c) == ((a || b) && c)

Beispielcode:

%Vor%

Die Ausgabe:

%Vor%

Daher hat && eine höhere Priorität als || .

    
janos 20.05.2015 07:47
quelle
3

Ich habe mir die Java-Spezifikation angesehen, um zu sehen, ob sie die Operator-Priorität für && und ||

definiert haben

Beide sind als linksassoziativ definiert, und es ist keine Operatorpriorität definiert.

Siehe s. 15.7.3 ein bisschen runter von s. 17.7 , && s. 15.23 , || s. 15.24

d. Java definiert:

%Vor%

Wie:

%Vor%     
Dan D. 14.12.2010 07:13
quelle
3
Auch ich hatte dieselbe Frage, aber die Antwort gab mir praktisch. Hier ist mein Beispiel:

%Vor%

entspricht

%Vor%

Mit diesem Beispiel ist es einfach zu sehen, dass unter der Haube in Java die logische & amp; & amp; hat eine höhere Priorität als ||.

    
WorkMindDesigns 18.09.2015 19:29
quelle
3

Sie können nichts Nützliches über eine Programmiersprache beweisen, indem Sie nur Beispiele schreiben / ausführen. Soweit Sie wissen, könnte der Compiler implementiert werden, um Code auf unlogische, inkonsistente oder nichtdeterministische Weise zu kompilieren.

Selbst wenn Sie eine deterministische Kompilierung und deterministische Ausführung annehmen, ist das einzige Kompilieren / Ausführen eines Beispiels, dass dieses spezielle Beispiel ein bestimmtes Verhalten aufweist. Sie können nicht logisch von einem Beispiel zu einem anderen verallgemeinern, weil der Compiler ohne Bezug zu einer Spezifikation nur eine Blackbox ist. (Ihr nächstes Beispiel könnte das sein, das völlig gegensätzlich behandelt wird.)

Der richtige Weg, ein Verständnis für eine Programmiersprache zu entwickeln, ist, die Sprachspezifikation, ein gutes Lehrbuch oder ein gutes Tutorial zu lesen. Kombinieren Sie dies mit dem Schreiben von Code, um Ihr Verständnis zu bestätigen.

Wenn Sie sich beim Lesen von Beispielcode und Schreiben von Testprogrammen nur auf verlassen , werden Sie wahrscheinlich Missverständnisse und schlechte Angewohnheiten aufgreifen, die schmerzhaft sein können, um zu verlernen.

    
Stephen C 14.12.2010 07:14
quelle
1

Ein einfacher Test ist:

%Vor%

Beachten Sie, dass dies der Möglichkeit entspricht, dass && und || die gleiche Priorität haben könnten, und bestimmt dann in diesem Fall, ob sie von links nach rechts oder von rechts nach links ausgeführt werden.

Leider ist dies nicht vorrangig für Änderungen oder Vorrang auf der Basis von innen nach außen oder von außen nach innen oder vielen anderen möglichen Operationen, nicht zu erwähnen, dass sie von bösartigen oder kaputten Compilern, bösartigen oder kaputten Computern besiegt werden können und kosmische Strahlung.

Wie auch immer, es ist wirklich schwer zu beweisen, dass dein Compiler / Computer / Universum dich nicht verwirrt. Überprüfen Sie daher zusätzlich zum Testen die Sprachspezifikation.

    
8bittree 20.09.2015 00:05
quelle
0

Darauf wird die ganze Zeit in Zeilen wie dem folgenden angewiesen.

Offensichtlich würden diese Beispiele explodieren, wenn der erste Ausdruck nicht immer ausgewertet würde und der zweite Ausdruck nicht bedingt ausgewertet würde.

%Vor%     
Peter Lawrey 14.12.2010 07:51
quelle
0

Sowohl & amp; & amp; und || haben die gleiche Priorität, Auswertung erfolgt von links nach rechts. Lassen Sie mich mit einem Beispiel erklären.

%Vor%

Dies ergibt Folgendes: -

%Vor%

Aber lassen Sie mich jetzt arg3 () ändern, um false

zurückzugeben %Vor%

Dies führt zu: -

%Vor%

Also zum Schluss .. die Auswertung erfolgt von links nach rechts, d. h.

%Vor%

Hoffe, das hilft.

    
Amrut Prabhu 04.10.2017 07:13
quelle

Tags und Links