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.
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:
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.
Wenn &&
keine höhere Priorität als ||
hat, dann ist dieser Ausdruck:
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:
a
, b
und c
(a || b && c) == ((a || b) && c)
Beispielcode:
%Vor%Die Ausgabe:
%Vor%
Daher hat &&
eine höhere Priorität als ||
.
Ich habe mir die Java-Spezifikation angesehen, um zu sehen, ob sie die Operator-Priorität für &&
und ||
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%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 ||.
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.
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.
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%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.
Tags und Links java precedence