Warum hat Java keine zusammengesetzten Zuweisungsversionen der Bedingungs- und Bedingungsoperatoren? (& amp; & amp; =, || =)
Also für binäre Operatoren auf Boolean, Java hat &
|
^
&&
und ||
.
Lassen Sie uns zusammenfassen, was Sie tun, hier kurz:
- JLS 15.22.2 Boolean Logische Operatoren &, ^, |
- JLS 15.23 Bedingt-Und Betreiber &&
- JLS 15.24 Bedingte-Oder-Operator ||
Für
&
das Ergebnis Wert isttrue
wenn beide Operanden Werte sindtrue
; andernfalls ist das Ergebnisfalse
.Für
|
das Ergebnis Wert istfalse
wenn beide Operanden Werte sindfalse
; andernfalls ist das Ergebnistrue
.Für
^
das Ergebnis Wert isttrue
wenn die Operanden-Werte unterschiedlich sind; andernfalls ist das Ergebnisfalse
.Den
&&
Betreiber ist wie&
aber wertet seinen rechten Operanden nur dann, wenn der Wert seines linken Operanden isttrue
.Den
||
Betreiber ist wie|
aber wertet seinen rechten Operanden nur dann, wenn der Wert seines linken Operanden istfalse
.
Nun, unter all 5, 3 von denen haben zusammengesetzte Zuweisung Versionen, nämlich |=
&=
und ^=
. Also meine Frage ist offensichtlich: warum nicht Java stellen &&=
und ||=
? Ich finde, dass ich brauche, mehr als ich brauche &=
und |=
.
Und ich glaube nicht, dass "weil es zu lange" ist eine gute Antwort, denn Java hat >>>=
. Es muss einen besseren Grund für diese Unterlassung.
Vom 15.26 Zuweisungsoperatoren:
Gibt es 12 Zuweisungsoperatoren; [...]
= *= /= %= += -= <<= >>= >>>= &= ^= |=
Einen Kommentar gemacht wurde, dass, wenn &&=
und ||=
umgesetzt wurden, dann wäre es das einzige Unternehmen, das nicht auswerten der rechten Seite zuerst. Ich glaube, diese Vorstellung, dass eine zusammengesetzte Zuweisung-operator wertet der rechten Seite die erste ist ein Fehler.
Vom 15.26.2 Zusammengesetzte Zuweisungsoperatoren:
Eine zusammengesetzte Zuweisung Ausdruck der form
E1 op= E2
entsprichtE1 = (T)((E1) op (E2))
woT
ist die Art derE1
außer dassE1
wird nur einmal ausgewertet.
Als Beweis der folgende Abschnitt wirft einen NullPointerException
nicht ein ArrayIndexOutOfBoundsException
.
int[] a = null;
int[] b = {};
a[0] += b[-1];
InformationsquelleAutor der Frage polygenelubricants | 2010-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grund
Den Betreibern
&&=
und||=
sind nicht verfügbar auf Javaweil für die meisten Entwickler diese Operatoren sind:Beispiel für
&&=
Wenn Java erlaubt
&&=
Betreiber, so dass-code:wäre äquivalent zu:
Dieser erste code ist fehleranfälligweil viele Entwickler denken würde
f2()
wird immer dann aufgerufen, was die f1() zurückgegebene Wert. Es ist wiebool isOk = f1() && f2();
wof2()
wird nur aufgerufen, wennf1()
zurücktrue
.Will der Entwickler
f2()
werden nur aufgerufen, wennf1()
zurücktrue
daher der zweite code oben ist weniger Fehler-anfällig.Sonst
&=
ist ausreichend, da der Entwickler willf2()
werden immer genannt:Gleiche Beispiel, aber für
&=
Darüber hinaus der JVM laufen soll dies über code wie den folgenden ein:
Vergleichen
&&
und&
ErgebnisseSind die Ergebnisse der Operatoren
&&
und&
das gleiche, wenn angewandt, auf boolean-Werte?Lassen Sie uns überprüfen Sie mit dem folgenden Java-code:
Ausgabe:
Daher JA können wir ersetzen
&&
durch&
für Boolesche Werte 😉Also besser
&=
statt&&=
.Gleiche für
||=
Gleichen Gründen wie für
&&=
:Betreiber
|=
ist weniger fehleranfällig als die||=
.Wenn ein Entwickler will
f2()
nicht aufgerufen werden, wennf1()
zurücktrue
dann habe ich die Ratschläge der folgenden alternativen:oder:
InformationsquelleAutor der Antwort olibre
Wahrscheinlich, weil so etwas wie
sieht wie es sein sollte die Zuordnung zu
x
und BewertungsomeComplexExpression()
aber die Tatsache, dass die Bewertung hängt von dem Wert derx
nicht ersichtlich ist, von der syntax.Auch, weil der Java-syntax basiert auf C, und niemand sah eine dringende Notwendigkeit für die Betreiber. Sie wäre wahrscheinlich besser dran mit einer if-Anweisung, sowieso.
InformationsquelleAutor der Antwort Josh Lee
Es ist auf diese Weise in Java, denn es ist auf diese Weise in C.
Nun die Frage, warum es so in C, weil, als & und && wurde verschiedenen Operatoren (irgendwann vorhergehenden C Abstieg aus B), die &= Vielzahl von Betreibern wurde einfach übersehen.
Aber der zweite Teil meiner Antwort keine Quellen, um es wieder auf.
InformationsquelleAutor der Antwort EFraim
Java original Ziele war "Einfach, Objekt-Orientiert und Vertraut." Angewandt auf diesen Fall, &= vertraut ist (C, C++ haben und vertraut in diesem Zusammenhang bedeutete, vertraut jemandem, der weiß, diese zwei).
&&= würde nicht bekannt sein, und es würde nicht einfach sein, in dem Sinne, dass die Sprache, die Designer waren nicht auf der Suche, denke, dass jeder operator können Sie auf die Sprache, so dass weniger zusätzliche Operatoren werden vereinfacht.
InformationsquelleAutor der Antwort Yishai
Weitgehend, weil die Java-syntax basiert auf C (oder mindestens die C-Familie), und in C alle diese Operatoren erhalten kompiliert arithmetischen oder bitweisen Montageanleitung auf einem einzigen register. Der Zuweisungsoperator version vermeidet Provisorien und möglicherweise erzeugt effizienteren code auf frühen nicht-optimierende Compiler. Der logische operator (wie Sie bezeichnet sind, in C) äquivalente (
&&=
und||=
) haben nicht so eine offensichtliche Korrespondenz zu einzelnen Montageanleitung; Sie in der Regel zu erweitern, um ein test-und Zweig-Sequenz von Anweisungen.Interessanterweise Sprachen wie ruby tun haben ||= und &&=.
Edit: Terminologie unterscheidet sich zwischen Java und C
InformationsquelleAutor der Antwort p00ya
Für Boolesche Variable, && und || verwenden würde, short circuit evaluation, während & und | nicht, so würden Sie erwarten, &&= und ||= auch short-circuit-Evaluierung. Es gibt eine gute Verwendung für diese. Vor allem, wenn Sie Durchlaufen eine Schleife, die Sie wollen schnell, effizient und knapp.
Statt zu schreiben
Möchte ich schreiben
und wissen, dass, sobald bVal gilt, fn() wird nicht aufgerufen werden, für den Rest der Iterationen.
InformationsquelleAutor der Antwort zanfilip
'
&
' und '&&
' sind nicht das gleiche wie "&&
' ist ein kurzer Schnitt-operation, die das nicht tun, wenn der erste operand false ist, während '&
' es trotzdem tun will (arbeiten mit Zahl und boolean).Ich willige ein, dass es mehr Sinn machen, zu existieren, aber es ist nicht schlimm wenn Sie es nicht ist. Ich denke, es war nicht da, weil C nicht hat.
Wirklich nicht denken, warum.
InformationsquelleAutor der Antwort NawaMan
Ist es erlaubt in Ruby.
Wenn ich denke, ich würde sagen, es ist nicht Häufig verwendet, sodass es nicht implementiert war. Eine andere Erklärung könnte sein, dass der parser sieht nur die Zeichen vor dem =
InformationsquelleAutor der Antwort zzawaideh
a&b und a && b sind nicht dasselbe.
a && b ist ein boolescher Ausdruck, der einen booleschen Wert zurückgibt, und a & b ist eine bitweise Ausdruck, liefert einen int (wenn a und b sind Ganzzahlen).
was denken Sie, Sie sind die gleichen?
InformationsquelleAutor der Antwort Omry Yadan
Ich kann mir nicht vorstellen, dass es eine besseren Grund, dann 'Es sieht unglaublich hässlich!'
InformationsquelleAutor der Antwort Daniel Brückner
&
überprüft beide Operanden, es ist ein bitweiser operator. Java definiert verschiedene bitweise Operatoren, die angewendet werden können, um die ganzzahligen Typen long, int, short, char und byte.
&&
Stoppt die Auswertung, wenn der erste operand zu false ausgewertet, da das Ergebnis wird falsch, es ist ein logischer operator. Es kann angewendet werden, um Boolesche Werte.
&Amp;& - operator ist ähnlich wie die & - operator, sondern machen den code etwas effizienter. Da beide Ausdrücke im Vergleich mit dem & Betreiber muss sein, true für den gesamten Ausdruck zu stimmt, es gibt keinen Grund, zu bewerten, der zweite Ausdruck, wenn die ersten zurück falsch. Die & - operator, wertet immer beide Ausdrücke. Die && operator ausgewertet wird der zweite Ausdruck nur dann, wenn der erste Ausdruck wahr ist.
Having a &&= Zuweisungsoperator würden nicht wirklich neue Funktionalität hinzufügen, um die Sprache. Der bitweise operator Arithmetik ist viel mehr Ausdruck, die Sie tun können, integer bitweise Arithmetik, enthält Boolesche Arithmetik. Die logischen Operatoren können nur Boolesche Arithmetik.
InformationsquelleAutor der Antwort Ely