2017-05-09 44 views
3

我嘗試以下的代碼:速記操作者給出了兩個不同的結果

class Converter{ 

    public static void main(String args[]) { 
     byte num = 1; 
     num = num * 2.5; // line 1 
     System.out.println("Result is : "+num); 
    } 
} 

所以編譯器發出一個錯誤爲:

error: incompatible types: possible lossy conversion from double to the byte at line 1 

在以後,我改變了線1與速記運算符= *:

class Converter{ 

     public static void main(String args[]) { 
      byte num = 1; 
      num *= 2.5; 
      System.out.println("Result is : "+num); 
     } 
    } 

它的編譯和輸出成功運行:

Result is:2 

我可以知道,簡寫操作符在JAVA中的工作方式不同。爲什麼會這樣呢?

+1

爲什麼你認爲它would'nt發生?它基本上做'x =(byte)(x * y)'。所以它有一個隱式類型轉換。我的意思是第一個錯誤已經警告過你,當從'double'轉換爲'byte'時,類型轉換會使你失去精確度 – SomeJavaGuy

+0

使用'javap -v Converter.class'來查看第二種情況發生了什麼。請特別注意d2i和i2b指令:) – TheLostMind

+0

所以我可以這麼說速記運算符能夠抑制有損轉換錯誤,並且只是簡單地做了什麼輸入呢? – Kamalakar

回答

9

從JLS compound assigment operator文檔,可以看到下面的例子:

例如,下面的代碼是正確的:

short x = 3; 
x += 4.6; 

和具有該值的結果以x因爲它相當於:

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

它只是默認自動轉換結果。

PS:在此other answer我試圖解釋,你需要轉換就像使用JLS

short x = 3; 
x = x + 1; //Won't compile 

據realativly新,所以我願意接受建議有以下操作的原因。

1

如已經由AxelH表示,它是一個compound assignement但我想uderline此:

形式E1 op= E2的化合物賦值表達式是等效 到E1 = (T) ((E1) op (E2)),其中TE1類型,除了E1 僅評估一次。

這意味着根據定義它是鑄造結果。例如:

byte b = 1; 
b *= 2.3; 
System.out.println(b); // prints 2 

從您的評論:

所以我可以說,速記運營商抑制有損轉換 錯誤,只是做什麼輸入它?

不,你不能。它不會抑制任何錯誤,因爲在投射時沒有錯誤(在這種情況下)。

+0

@AxelH我認爲你的答案很好。我也upvoted。但我只是想強調爲什麼會發生這種情況。現在閱讀OP的評論引導我更好地解釋說,它不會抑制任何錯誤。相反,它是鑄造。這是不同的。 – granmirupa

+0

我同意,順便說一下,你的例子應該使用'b = 1'而不是'b = 10'來顯示有損轉換;} – AxelH

+0

@AxelH是肯定的.. [lapsus](https://en.wikipedia .org/wiki/Lapsus):) – granmirupa

1

根據java語言規範"15.26.2. Compound Assignment Operators"

形式E1 OP的化合物賦值表達式= E2相當於 到E1 =(T)((E1)OP(E2)),其中T是E1的類型,不同的是E1 被評估只有一次。

你可以在編譯後看到你的例子的字節碼(檢查instruction 3-10)。

3: i2d //convert an int into a double 
    4: ldc2_w   #2     // double 2.5d 
    7: dmul //multiply two doubles 
    8: d2i // convert a double to an int 
    9: i2b //convert an int into a byte 
    10: istore_1 //store int value into variable 1 

enter image description here

相關問題