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


Bis heute dachte ich zum Beispiel:

i += j;

ist nur eine Abkürzung für:

i = i + j;

Aber was, wenn wir das versuchen:

int i = 5;
long j = 8;

Dann i = i + j; kompiliert aber nicht i += j; wird gut kompilieren.

Bedeutet das tatsächlich? i += j; ist eine Abkürzung für so etwas i = (type of i) (i + j)?


3283
2018-01-03 10:10


Ursprung


Antworten:


Wie immer bei diesen Fragen hält der JLS die Antwort bereit. In diesem Fall §15.26.2 Zusammengesetzte Zuweisungsoperatoren. Ein Auszug:

Ein zusammengesetzter Zuweisungsausdruck des Formulars E1 op= E2 ist äquivalent zu E1 = (T)((E1) op (E2)), woher T ist die Art von E1, außer dass E1 wird nur einmal ausgewertet.

Ein Beispiel zitiert von §15.26.2

[...] der folgende Code ist richtig:

short x = 3;
x += 4.6;

und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:

short x = 3;
x = (short)(x + 4.6);

Mit anderen Worten, Ihre Annahme ist richtig.


2210
2018-01-03 10:15



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

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

oder

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

oder

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

oder

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'

442
2018-01-03 10:20



Sehr gute Frage. Das Java-Sprachspezifikation Bestätigt Ihren Vorschlag.

Zum Beispiel ist der folgende Code korrekt:

short x = 3;
x += 4.6;

und führt dazu, dass x den Wert 7 hat, weil es äquivalent ist zu:

short x = 3;
x = (short)(x + 4.6);

223
2018-01-03 10:17



Ja,

im Grunde, wenn wir schreiben

i += l; 

der Compiler konvertiert dies in

i = (int)(i + l);

Ich habe gerade die .class Dateicode.

Wirklich eine gute Sache zu wissen


163
2018-01-03 10:19



Sie müssen auswerfen long zu int  explicitly im Falle von i = i + l  dann wird es kompilieren und korrekte Ausgabe geben. mögen

i = i + (int)l;

oder

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

aber im Falle von += Es funktioniert einfach gut, weil der Operator implizit den Typ vom Typ der rechten Variablen in den Typ der linken Variablen umwandelt, also nicht explizit umgewandelt werden muss.


85
2018-01-03 10:15



Das Problem ist hier das Gießen.

Wenn Sie int hinzufügen und lang,

  1. Das Int-Objekt wird zu lange geworfen und beide werden hinzugefügt und Sie erhalten ein langes Objekt.
  2. Langes Objekt kann jedoch nicht implizit in int umgewandelt werden. Also musst du das explizit tun.

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


56
2018-01-03 10:20



In Java werden Typkonvertierungen 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:

 Byte -> Kurz -> Int -> Lang -> Float -> Double. 

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 - Konvertierung


47
2018-01-23 05:50



Manchmal kann eine solche Frage in einem Interview gestellt werden.

Zum Beispiel, wenn Sie schreiben:

int a = 2;
long b = 3;
a = a + b;

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:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting

37
2017-12-02 10:40