Ich frage mich nur, warum wir normalerweise ein logisches ODER ||
zwischen zwei Booleschen Werten verwenden, die nicht bitweise ODER sind |
, obwohl beide gut funktionieren.
Ich meine, schauen Sie sich Folgendes an:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
Können wir |
statt verwenden ||
? Gleiches mit &
und &&
.
java
bitwise-operators
Eng.Fouad
quelle
quelle
||
und&&
kurzschließen während|
und&
sind eifrig.&&
und||
, aber nie&
|
. Wenn Sie etwas tun, das von Nebenwirkungen abhängt, verstehe ich nicht, warum Sie so etwas verwenden würden,(a & b | c)
da jemand leicht denken könnte: "Ich kann dies durch die Verwendung der kurzgeschlossenen Versionen optimieren."Antworten:
Wenn Sie die
||
und&&
-Formen anstelle der|
und&
-Formen dieser Operatoren verwenden, wird Java nicht die Mühe machen, den rechten Operanden allein auszuwerten.Es ist eine Frage, ob Sie die Auswertung kurzschließen möchten oder nicht - meistens möchten Sie.
Ein guter Weg, um die Vorteile eines Kurzschlusses zu veranschaulichen, wäre das folgende Beispiel.
Ein weiterer Vorteil des Kurzschlusses ist, wie Jeremy und Peter erwähnt haben, die Nullreferenzprüfung:
Mehr Info
quelle
foo != null && foo.hasBar()
foo != null && foo.hasBar()
) oder schneller (b || foo.timeConsumingCall()
). 99% der Entwickler sollten sich jedoch keine Gedanken über diese Mikrooptimierung machen müssen.string == null || string.isEmpty()
;)|
führt keine Kurzschlussauswertung in booleschen Ausdrücken durch.||
wird aufhören zu bewerten, ob der erste Operand wahr ist, wird es aber|
nicht.Darüber hinaus
|
kann die bitweise ODER-Verknüpfung für Byte / Short / Int / Long-Werte ausgeführt werden.||
kann nicht.quelle
Um auf den anderen Antworten anhand eines Beispiels aufzubauen, ist das Kurzschließen bei den folgenden Defensivprüfungen von entscheidender Bedeutung:
Die Verwendung von
|
und&
könnte dazu führen,NullPointerException
dass hier geworfen wird.quelle
foo
. Peter Lawreys "kanonisches Beispiel" ist das beste.Logisch
||
und&&
überprüfen Sie die rechte Seite nur bei Bedarf. Die|
und&
überprüfen Sie beide Seiten jedes Mal.Beispielsweise:
Schreiben Sie es um:
Ein anderes Beispiel:
Schreiben Sie es um:
quelle
Beachten Sie auch eine häufige Gefahr: Die nicht faulen Operatoren haben Vorrang vor den faulen, also:
Seien Sie vorsichtig beim Mischen.
quelle
Neben dem Kurzschließen ist auch zu beachten, dass eine bitweise Logikoperation für Werte, die nicht 0 oder 1 sein können, eine ganz andere Bedeutung hat als die bedingte Logik. Während es normalerweise für
|
und gleich ist||
, mit&
und&&
Sie erhalten sehr unterschiedliche Ergebnisse (zB2 & 4
ist 0 / false während2 && 4
1 / wahr ist).Wenn das, was Sie von einer Funktion erhalten, tatsächlich ein Fehlercode ist und Sie auf Nicht-0-Ness testen, kann dies ziemlich wichtig sein.
Dies ist in Java nicht so ein Problem, bei dem Sie explizit boolesch typisieren oder mit 0 oder ähnlichem vergleichen müssen, aber in anderen Sprachen mit ähnlicher Syntax (C / C ++ et al.) Kann es ziemlich verwirrend sein.
Beachten Sie auch, dass & und | kann nur auf ganzzahlige Werte angewendet werden und nicht auf alles, was einem booleschen Test entsprechen kann. Auch in Nicht-Java-Sprachen gibt es einige Dinge, die als Boolescher Wert mit einem impliziten
!= 0
Vergleich verwendet werden können (Zeiger, Gleitkommazahlen, Objekte mit einemoperator bool()
usw.), und bitweise Operatoren sind in diesen Kontexten fast immer unsinnig.quelle
Das einzige Mal, wenn Sie
|
oder&
anstelle von||
oder verwenden würden&&
ist, wenn Sie sehr einfache boolesche Ausdrücke haben und die Kosten für Abkürzungen (dh einen Zweig) höher sind als die Zeit, die Sie sparen, wenn Sie die späteren Ausdrücke nicht auswerten.Dies ist jedoch eine Mikrooptimierung, die nur im niedrigsten Code von Bedeutung ist.
quelle
|| ist der logische oder Operator während | ist der bitweise oder Operator.
quelle
a | b: bewerte b auf jeden Fall
a || b: bewerte b nur, wenn a als falsch ausgewertet wird
quelle
Zusätzlich zu der Tatsache, dass | ist ein bitweiser Operator: || ist ein Kurzschlussoperator - wenn ein Element falsch ist, werden die anderen nicht überprüft.
wenn etwas WAHR ist, || wird nichts auswerten, während | Wird besorgt. Wenn die Variablen in Ihren if-Anweisungen tatsächlich Funktionsaufrufe sind, verwenden Sie || spart möglicherweise viel Leistung.
quelle
quelle
Die Operatoren
||
und&&
werden als bedingte Operatoren bezeichnet , während|
und&
als bitweise Operatoren bezeichnet werden . Sie dienen verschiedenen Zwecken.Bedingte Operatoren funktionieren nur mit Ausdrücken, die statisch ausgewertet werden
boolean
sowohl auf der linken als auch auf der rechten Seite .Bitweise Operatoren funktionieren mit beliebigen numerischen Operanden.
Wenn Sie einen logischen Vergleich durchführen möchten, sollten Sie bedingte Operatoren verwenden , da Sie Ihrem Code eine Art Typensicherheit hinzufügen.
quelle
|
und&
sind auch bedingte Operatoren. Bitte beachten Sie den Link in meinem Kommentar zum Originalbeitrag.|
und&
als bitweise Operatoren verwendet werden kann, ist ein völlig anderes Problem.Eine Randnotiz: Java hat | = aber kein || =
Ein Beispiel dafür, wann Sie || verwenden müssen ist, wenn der erste Ausdruck ein Test ist, um zu sehen, ob der zweite Ausdruck explodieren würde. zB mit einem einzigen | Im folgenden Fall kann es zu einer NPE kommen.
quelle
Die anderen Antworten haben den funktionalen Unterschied zwischen den Operatoren gut abgedeckt, aber die Antworten könnten für nahezu jede einzelne C-abgeleitete Sprache gelten, die heute existiert. Die Frage ist markiert mitJavaund so werde ich mich bemühen, spezifisch und technisch für die Java-Sprache zu antworten.
&
und|
können entweder ganzzahlige bitweise Operatoren oder boolesche logische Operatoren sein. Die Syntax für die bitweisen und logischen Operatoren ( §15.22 ) lautet:Die Syntax für
EqualityExpression
ist in §15.21 definiert , was eineRelationalExpression
Definition in §15.20 erfordert , was wiederum erfordertShiftExpression
undReferenceType
in §15.19 bzw. §4.3 definiert ist.ShiftExpression
erfordertAdditiveExpression
in definierten §15.18 , die Definition der grundlegenden arithmetischen, unäre Operatoren etc. Drilldown weiterReferenceType
bohrt nach unten in alle die verschiedenen Möglichkeiten , eine Art darzustellen. (ObwohlReferenceType
die primitiven Typen nicht enthalten sind, ist letztendlich die Definition der primitiven Typen erforderlich, da sie der Dimensionstyp für ein Array sein können, bei dem es sich um a handeltReferenceType
.)Die bitweisen und logischen Operatoren haben die folgenden Eigenschaften:
Die Unterscheidung, ob der Operator als bitweiser Operator oder als logischer Operator dient, hängt davon ab, ob die Operanden "in einen primitiven Integraltyp konvertierbar" sind ( §4.2 ) oder ob sie vom Typ sind
boolean
oderBoolean
( §5.1.8 ).Wenn die Operanden ganzzahlige Typen sind, wird für beide Operanden eine binäre numerische Heraufstufung ( §5.6.2 ) durchgeführt, wobei beide als
long
s oderint
s für die Operation verbleiben . Der Typ der Operation ist der Typ der (heraufgestuften) Operanden. Zu diesem Zeitpunkt ist&
bitweises UND,^
bitweises exklusives ODER und|
bitweises inklusive ODER. ( §15.22.1 )Wenn die Operanden
boolean
oder sindBoolean
, werden die Operanden bei Bedarf einer Unboxing-Konvertierung unterzogen ( §5.1.8 ), und der Typ der Operation istboolean
.&
führt dazu,true
wenn beide Operanden sindtrue
,^
führt dazu,true
wenn beide Operanden unterschiedlich sind, und|
führt dazu,true
wenn einer der Operanden isttrue
. ( §15.22.2 )Im Gegensatz dazu
&&
ist der "Bedingte-Und-Operator" ( §15.23 ) und der "Bedingte-Und||
-Operator" ( §15.24 ). Ihre Syntax ist definiert als:&&
ist wie&
, außer dass es nur den rechten Operanden auswertet, wenn der linke Operand isttrue
.||
ist wie|
, außer dass es nur den rechten Operanden auswertet, wenn der linke Operand istfalse
.Bedingt-Und hat die folgenden Eigenschaften:
Conditional-Or hat folgende Eigenschaften:
Kurz gesagt, wie @JohnMeagher hat wiederholt in den Kommentaren darauf hingewiesen,
&
und|
ist in der Tat nicht-Kurzschließen Booleschen Operatoren in dem speziellen Fall der Operanden entwederboolean
oderBoolean
. Bei bewährten Verfahren (dh keine Nebenwirkungen) ist dies ein geringfügiger Unterschied. Wenn die Operanden jedoch nichtboolean
s oderBoolean
s sind, verhalten sich die Operatoren sehr unterschiedlich: Bitweise und logische Operationen lassen sich auf der hohen Ebene der Java-Programmierung einfach nicht gut vergleichen.quelle
1). (Ausdruck1 | Ausdruck2), | Der Operator wertet expression2 aus, unabhängig davon, ob das Ergebnis von expression1 wahr oder falsch ist.
Beispiel:
2). (Ausdruck1 || Ausdruck2), || Der Operator wertet expression2 nicht aus, wenn expression1 wahr ist.
Beispiel:
quelle
|| Gibt einen booleschen Wert zurück, indem zwei Werte ODER-verknüpft werden (aus diesem Grund wird er als LOGICAL oder bezeichnet).
IE:
Würde true zurückgeben, wenn entweder A oder B wahr ist, oder false, wenn beide falsch sind.
| ist ein Operator, der eine bitweise Operation für zwei Werte ausführt. Um die bitweisen Operationen besser zu verstehen, können Sie hier lesen:
http://en.wikipedia.org/wiki/Bitwise_operation
quelle
Ein Hauptunterschied ist, dass || und && weisen "Kurzschluss" auf, sodass die RHS nur bei Bedarf ausgewertet wird.
Zum Beispiel
Wenn a wahr ist, wird b nicht getestet und Pfad1 wird ausgeführt. Wenn | verwendet wurde, würden dann beide Seiten ausgewertet, auch wenn 'a' wahr ist.
Weitere Informationen finden Sie hier und hier .
Hoffe das hilft.
quelle
Ein Kurzschluss kann nützlich sein. Manchmal möchten Sie sicherstellen, dass zwei Ausdrücke ausgewertet werden. Angenommen, Sie haben eine Methode, mit der ein Objekt aus zwei separaten Listen entfernt wird. Vielleicht möchten Sie so etwas tun:
Wenn Ihre Methode stattdessen den bedingten Operanden verwendet, kann das Objekt nicht aus der zweiten Liste entfernt werden, wenn die erste Liste false zurückgibt.
Es ist nicht besonders nützlich, und (wie bei den meisten Programmieraufgaben) können Sie es mit anderen Mitteln erreichen. Dies ist jedoch ein Anwendungsfall für bitweise Operanden.
quelle
Der grundlegende Unterschied zwischen ihnen ist, dass | konvertiert zuerst die Werte in binär und führt dann die bitweise oder Operation aus. Inzwischen || konvertiert die Daten nicht in Binärdaten und führt nur den Ausdruck oder im ursprünglichen Zustand aus.
Lesen Sie mehr: http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk
quelle
Als ich diese Frage hatte, habe ich Testcode erstellt, um eine Vorstellung davon zu bekommen.
In diesem Fall ändern wir nur den Wert auf der linken Seite der if-Bedingung, indem wir a oder b hinzufügen.
Ausgabe
"If condition executed"
Ausgabe-
Conclusion of ||
Bei Verwendung||
prüft die rechte Seite nur, wenn die linke Seite falsch ist.Ausgabe-
Ausgabe-
Conclusion of |
|
Überprüfen Sie bei der Verwendung sowohl die linke als auch die rechte Seite.quelle
| = bitweise oder || = Logik oder
quelle
Normalerweise verwende ich, wenn es einen Operator vor und nach dem Inkrement gibt. Sehen Sie sich den folgenden Code an:
Ausgabe:
Beide
if
Blöcke sind gleich, aber das Ergebnis ist unterschiedlich. Wenn dies|
der Fall ist , werden beide Bedingungen ausgewertet. Wenn dies jedoch||
der Fall ist , wird die zweite Bedingung nicht bewertet, da die erste Bedingung bereits erfüllt ist.quelle
Es gibt viele Anwendungsfälle, die darauf hinweisen, warum Sie sich
||
eher für als für entscheiden sollten|
. In einigen Anwendungsfällen muss der|
Operator verwendet werden, um alle Bedingungen zu überprüfen.Wenn Sie beispielsweise die Formularüberprüfung überprüfen und dem Benutzer alle ungültigen Felder mit Fehlertexten anzeigen möchten und nicht nur ein erstes ungültiges Feld.
||
Betreiber wäre,Wenn der Benutzer mit dem obigen Snippet das Formular mit ALLEN leeren Feldern sendet, wird NUR
nameField
eine Fehlermeldung angezeigt. Aber wenn Sie es ändern,Unabhängig von den
true
Bedingungen wird in jedem Feld die richtige Fehlermeldung angezeigt .quelle
Nach sorgfältigem Lesen dieses Themas ist mir immer noch unklar, ob die Verwendung
|
als logischer Operator den Java-Musterpraktiken entspricht.Ich habe kürzlich den Code in einer Pull-Anfrage geändert, in der ein Kommentar wo adressiert wurde
musste geändert werden auf
Was ist die tatsächlich akzeptierte Version?
Nicht an einer Abstimmung interessiert, sondern mehr daran, den Standard herauszufinden?! Beide Codeversionen werden kompiliert und funktionieren wie erwartet.
quelle
|| ist ein logisches oder und | ist ein bisschen weise oder.
quelle
Java-Operatoren
| ist bitweise oder || ist logisch oder.
quelle
Schauen Sie sich an:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html
| ist bitweise inklusive ODER
|| ist logisch ODER
quelle
| ist ein bitweiser Operator. || ist ein logischer Operator.
Man nimmt zwei Bits und oder sie.
Man wird die Wahrheit bestimmen (dies ODER das). Wenn dies wahr ist oder das wahr ist, dann ist die Antwort wahr.
Oh, und verdammt, die Leute beantworten diese Fragen schnell.
quelle