Bis heute dachte ich zum Beispiel:
%Vor%ist nur eine Abkürzung für:
%Vor%Aber was, wenn wir das versuchen:
%Vor% Dann wird i = i + j;
nicht kompiliert, aber i += j;
wird gut kompiliert.
Heißt das, dass i += j;
eine Abkürzung für so etwas ist?
i = (type of i) (i + j)
?
Wie immer bei diesen Fragen hält die JLS die Antwort bereit. In diesem Fall §15.26.2 Zusammengesetzte Zuweisungsoperatoren . Ein Auszug:
Ein zusammengesetzter Zuweisungsausdruck der Form
E1 op= E2
ist äquivalent zuE1 = (T)((E1) op (E2))
, wobeiT
der Typ vonE1
ist, außer dassE1
nur einmal ausgewertet wird.
Ein Beispiel aus §15.26.2
[...] der folgende Code ist korrekt:
%Vor%und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:
%Vor%
Mit anderen Worten, Ihre Annahme ist richtig.
Ein gutes Beispiel für dieses Casting ist die Verwendung von * = oder / =
%Vor%oder
%Vor%oder
%Vor%oder
%Vor%Sehr gute Frage. Die Java-Sprachspezifikation bestätigt Ihren Vorschlag.
Zum Beispiel ist der folgende Code korrekt:
%Vor%und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:
%Vor%
Ja,
grundsätzlich, wenn wir
schreiben %Vor%konvertiert der Compiler dies in
%Vor% Ich habe gerade den Dateicode .class
überprüft.
Wirklich eine gute Sache zu wissen
Sie müssen von long
auf int
explicitly
im Falle von i = i + l
umwandeln, dann wird es kompiliert und gibt die korrekte Ausgabe aus. wie
oder
%Vor% aber im Fall von +=
funktioniert es einfach gut, weil der Operator implizit den Typ casting vom Typ der rechten Variable in den Typ der linken Variable umsetzt, also muss nicht explizit umgewandelt werden.
Das Problem besteht darin, Typ Casting.
Wenn Sie int und long hinzufügen,
Aber +=
ist so codiert, dass es Casting eingibt. i=(int)(i+m)
In Java werden Typumwandlungen automatisch ausgeführt, wenn der Typ des Ausdrucks auf der rechten Seite einer Zuweisungsoperation sicher zum Typ der Variablen auf der linken Seite der Zuweisung hochgestuft werden kann. So können wir sicher zuweisen:
%Vor% Das Gleiche wird nicht umgekehrt funktionieren. Zum Beispiel können wir ein long nicht automatisch in ein int umwandeln, da das erste mehr Speicher benötigt als das zweite und folglich Informationen verloren gehen können. Um eine solche Konvertierung zu erzwingen, müssen wir eine explizite Konvertierung durchführen.
Typ - Conversion
Manchmal kann eine solche Frage in einem Interview gestellt werden.
Zum Beispiel, wenn Sie schreiben:
%Vor% Es gibt keine automatische Typumwandlung. In C ++ wird es keinen Fehler geben, den obigen Code zu kompilieren, aber in Java erhalten Sie etwas wie Incompatible type exception
.
Um es zu vermeiden, müssen Sie Ihren Code folgendermaßen schreiben:
%Vor% Der Hauptunterschied besteht darin, dass mit a = a + b
keine Typumwandlung stattfindet und der Compiler auf Sie wütend wird, weil Sie nicht typisiert haben. Aber mit a += b
wird typecasting b
in einen Typ konvertiert, der mit a
kompatibel ist. Also wenn du es tust
Was du wirklich tust ist:
%Vor%Subtiler Punkt hier ...
Es gibt eine implizite Typumwandlung für i+j
, wenn j
ein Double und i
ein Int ist.
Java IMMER konvertiert eine Ganzzahl in ein Double, wenn zwischen ihnen eine Operation stattfindet.
Um i+=j
zu klären, wobei i
eine ganze Zahl ist und j
eine doppelte ist, kann als
Siehe: diese Beschreibung des impliziten Castings
Sie können in diesem Fall j
in (int)
eingeben, um die Übersicht zu behalten.
Im Fall des Compound-Zuweisungsoperators wird das interne Casting automatisch ausgeführt:
%Vor%Und in einigen Fällen werden Sie einige Werte verlieren:
%Vor%Tags und Links java casting operators variable-assignment assignment-operator