Warum benötigen die + =, - =, * =, / = Verbundzuweisungsoperatoren von Java nicht das Casting?

3195

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) ?

    
Honza Brabec 03.01.2012, 10:10
quelle

11 Antworten

2155

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 zu E1 = (T)((E1) op (E2)) , wobei T der Typ von E1 ist, außer dass E1 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.

    
Lukas Eder 03.01.2012, 10:15
quelle
433

Ein gutes Beispiel für dieses Casting ist die Verwendung von * = oder / =

%Vor%

oder

%Vor%

oder

%Vor%

oder

%Vor%     
Peter Lawrey 03.01.2012 10:20
quelle
218

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%
    
Thirler 03.01.2012 10:17
quelle
161

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

    
Umesh Awasthi 03.01.2012 10:19
quelle
83

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

%Vor%

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.

    
dku.rajkumar 03.01.2012 10:15
quelle
55

Das Problem besteht darin, Typ Casting.

Wenn Sie int und long hinzufügen,

  1. Das int-Objekt wird zu long & amp; beide werden hinzugefügt und du bekommst ein langes Objekt.
  2. aber langes Objekt kann nicht implizit in int umgewandelt werden. Also, Sie müssen das explizit tun.

Aber += ist so codiert, dass es Casting eingibt. i=(int)(i+m)

    
Dinesh Sachdev 108 03.01.2012 10:20
quelle
45

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

    
tinker_fairy 23.01.2013 05:50
quelle
36

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%     
Stopfan 02.12.2014 10:40
quelle
17

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

%Vor%

Was du wirklich tust ist:

%Vor%     
eukaryote 07.06.2015 23:27
quelle
5

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

beschrieben werden %Vor%

Siehe: diese Beschreibung des impliziten Castings

Sie können in diesem Fall j in (int) eingeben, um die Übersicht zu behalten.

    
Gabe Nones 18.01.2016 20:07
quelle
-3

Im Fall des Compound-Zuweisungsoperators wird das interne Casting automatisch ausgeführt:

%Vor%

Und in einigen Fällen werden Sie einige Werte verlieren:

%Vor%     
quelle