Warum nicht Java haben zusammengesetzte Zuweisung Versionen der bedingten und bedingten und oder-Operatoren? (&&=, ||=)
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];
Was bedeutet &= bedeuten ? Jemand kann bitte mir sagen ?
mögliche Duplikate von Warum muss ein "&&=" - Operator nicht vorhanden ist?
Diese Frage ist schon etwas älter, aber das hat mehr Stimmen und eingehende links. Ich würde sagen, wenn es einen merge, merge die alte diese (ja, das kann getan werden).
Es ist fest in Scala.
InformationsquelleAutor polygenelubricants | 2010-02-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Grund
Den Betreibern
&&=
und||=
sind nicht verfügbar auf Java, weil 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ällig, weil 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:
Hi @StriplingWarrior. Ich habe mit meinem Kollegen Yannick, unser bestes Java-Experte. Ich aktualisiert meine Antwort mithilfe des Java-Quellcodes verwendet, um zu überprüfen, dass Punkt. Als Sie sagte
&
und&&
den gleichen Ergebnissen führen. Vielen Dank für Ihr feedback. Gefällt dir meine Antwort? Cheers.Was ist, wenn ich das tun möchte, sehr schnell? &&= schneller als &=, wenn es existierte, so sollten Sie verwenden
if (a) a = b
für GeschwindigkeitIch bin nicht einverstanden, wenn Sie sagen, "Und das ist nicht das, was wir wollen." Wenn ich Schreibe
isOK &&= f2();
ich würde mir wünschen, es zu Kurzschluss-genau wie&&
tut.Ich bin nicht einverstanden mit Ihrer Behauptung, dass die Betreiber wäre fehleranfällig oder unbrauchbar sind. Mit zusammengesetzten Zuordnungen ist etwas, was Sie tun, um eine Verknüpfung für den üblichen
A = A op B
, so dass jeder weiß, was Sie tun und können die Versorgung für die Folgen selbst. Wenn Ihre Gründe waren in der Tat die Ursache für seine Abwesenheit, ich würde es sehen als unerwünschte Bevormundung. Jedoch, ich möchte, ich danke Ihnen für das hinzufügen der Zeilebool isOk = f1() || f2() || f3() || f4();
weil das, was ich war zu blind, um zu sehen, mich.InformationsquelleAutor 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.
x() && y()
aussieht aus wie es sollte, zu bewerten, beide Seiten des Ausdrucks. Offensichtlich akzeptieren die Menschen, dass&&
ist Kurzschluss, so dass auch Sie folgendermaßen vor, um&&=
als gut.vereinbart. Ich glaube, in diesen Situationen ist es wichtig, daran zu erinnern, dass dies nicht das äquivalent zu x = x && someComplexExpression (), aber das äquivalent von x = someComplexExpression() && x. Der rechten Seite wird/werden soll, werden zuerst bewertet zu werden, im Einklang mit allen anderen Zuweisungsoperator. Und da &&= hätte nicht anders Verhalten als &=.
Das ist fair. Wie etwas aussieht, beruht auf dem, was Ihnen vertraut ist, obwohl, und ich denke, Sie wollen sich nicht fügen, nichts neues. Eine Sache ich mag über C/C++/Java/C# ist, dass die grundlegende syntax der Ausdrücke ist nahezu identisch.
sind Sie falsch. Die JLS ist sehr klar, was die zusammengesetzte Zuweisung machen soll. Siehe meine Ergänzung oben.
Ich denke, die sagen, dass Sie nicht da sind, weil die Designer folgten einfach den Vorrang set von C ist irreführend, da Sie es hinzufügen
>>>
und>>>=
, die sind völlig neu.InformationsquelleAutor 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 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 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
&
,|
und^
;&&
und||
sind die bedingten Operatoren.In der C-Terminologie && und || sind logische Operatoren", s6.5.13-14 in der ISO 9899:1999. Die bitweisen Operatoren sind nur "logisch", wenn man es auf ein einzelnes bit (ein boolean in java); es gibt keine single-bit-Typ in C sowie die logischen Operatoren es gelten für alle skalaren Typen.
InformationsquelleAutor 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.
if (fn(item)) { bVal = true; break; }
.InformationsquelleAutor 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 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 =
wahr. Ich glaube nicht, dass dieser. Ich denke, die einzige Erklärung ist dann, wie Häufig es verwendet wird.
InformationsquelleAutor zzawaideh
Ich kann mir nicht vorstellen, dass es eine besseren Grund, dann 'Es sieht unglaublich hässlich!'
Ich würde kaum betrachten
&&=
hässlichInformationsquelleAutor 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 Ely
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?
a & b
kann "boolean".a & b im Gegensatz zu a && b stets bewerten b.
InformationsquelleAutor Omry Yadan