operatoren - java+= deutsch




Warum müssen Javas+=,-=,*=,/= zusammengesetzte Zuweisungsoperatoren nicht umgewandelt werden? (7)

Bis heute dachte ich, dass zum Beispiel:

i += j;

War nur eine Abkürzung für:

i = i + j;

Aber wenn wir das versuchen:

int i = 5;
long j = 8;

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

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


Das Problem betrifft hier das Gießen von Typen.

Wenn Sie Int und Long hinzufügen,

  1. Das int-Objekt wird in long umgewandelt und beide werden hinzugefügt, und Sie erhalten ein long-Objekt.
  2. long object kann jedoch nicht implizit in int umgewandelt werden. Das musst du also explizit machen.

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


Der Hauptunterschied besteht darin, dass mit a = a + b keine Typumwandlung stattfindet und der Compiler deshalb wütend auf Sie ist, weil Sie keine Typumwandlung durchführen. Mit a += b wird jedoch wirklich b in einen Typ konvertiert, der mit a kompatibel ist. Also wenn du es tust

int a=5;
long b=10;
a+=b;
System.out.println(a);

Was Sie wirklich tun, ist:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);

Feiner Punkt hier ...

Es gibt eine implizite Typumwandlung für i+j wenn j ein Double und i ein Int ist. Java konvertiert IMMER eine ganze Zahl in ein Double, wenn sich zwischen ihnen eine Operation befindet.

Zur Verdeutlichung von i+=j wobei i eine ganze Zahl ist und j ein Double ist, kann als beschrieben werden

i = <int>(<double>i + j)

Siehe: diese Beschreibung des impliziten Castings

In diesem Fall sollten Sie aus Gründen der Übersichtlichkeit j in (int) typisieren.


In Java-Typkonvertierungen werden automatisch durchgeführt, wenn der Typ des Ausdrucks auf der rechten Seite einer Zuweisungsoperation sicher zum Typ der Variablen auf der linken Seite der Zuweisung heraufgestuft werden kann. So können wir sicher zuordnen:

 byte -> short -> int -> long -> float -> double. 

Dasselbe wird nicht umgekehrt funktionieren. Zum Beispiel können wir ein long nicht automatisch in ein int konvertieren, da für das erste mehr Speicher benötigt wird als für 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


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 kein Fehler beim Kompilieren des obigen Codes Incompatible type exception . In Java wird jedoch eine Incompatible type exception .

Um dies 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

Sehr gute Frage Die Java-Sprachspezifikation bestätigt Ihren Vorschlag.

Der folgende Code ist beispielsweise korrekt:

short x = 3;
x += 4.6;

und ergibt, dass x den Wert 7 hat, weil es äquivalent ist zu:

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

Wie immer bei diesen Fragen hält der JLS die Antwort. In diesem Fall §15.26.2. Operatoren für zusammengesetzte Zuweisungen . Ein Auszug:

Ein zusammengesetzter Zuordnungsausdruck der Form E1 op= E2 ist äquivalent zu E1 = (T)((E1) op (E2)) , wobei T der Typ von E1 , mit der Ausnahme, dass E1 nur einmal ausgewertet wird.

Ein Beispiel aus § 15.26.2

[...] der folgende Code ist korrekt:

short x = 3;
x += 4.6;

und ergibt, 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.





assignment-operator