為什麼Java的+ =, - =,* =,/ =複合賦值操作符需要轉換?


Answers

這個演員的一個很好的例子是使用* =或/ =

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

要么

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

要么

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

要么

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

直到今天,我認為,例如:

i += j;

只是一個捷徑:

i = i + j;

但是,如果我們嘗試這樣做:

int i = 5;
long j = 8;

然後i = i + j; 不會編譯,但i += j; 將編譯好。

這是否意味著實際上i += j; 是這樣的東西的捷徑i = (type of i) (i + j)




微妙點在這裡...

j是雙精度時, i+j存在隱式類型轉換,而i是整型。 當它們之間存在操作時,Java 總是將整數轉換為double。

澄清i+=j其中i是一個整數, j是一個double可以描述為

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

請參閱: 隱式轉換的描述

在這種情況下,為了清晰起見,您可能需要將j轉換為(int)




是,

基本上當我們寫作時

i += l; 

編譯器將其轉換為

i = (int)(i + l);

我剛剛檢查了.class文件代碼。

真的是一件很好的事情要知道




有時候,面試時可能會提出這樣的問題。

例如,當你寫:

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

沒有自動類型轉換。 在C ++中,編譯上述代碼不會出現任何錯誤,但在Java中,您將得到類似Incompatible type exception

所以要避免它,你必須像這樣編寫你的代碼:

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



這裡的問題涉及類型轉換。

當你添加int和long時,

  1. int對像被鑄造得很長,兩者都被添加,並且你獲得長對象。
  2. 但長對像不能隱式轉換為int。 所以,你必須明確地做到這一點。

但是+=以這種方式進行編碼,以至於可以進行類型轉換。 i=(int)(i+m)




Links