[英]Multiple typecasting in a single line in Java program
在今天亂搞Java語法的同時,我嘗試編譯以下java代碼:
class Mess {
public static void main(String[] args) {
float i = (char)(int)(long)(byte) 100;
System.out.println(i);
}
}
代碼實際上沒有給出編譯或運行時錯誤。 將i
數據類型更改為任何其他數據類型(如int
或double
或char
也有效。 不僅如此,在聲明中引入操作也沒有任何錯誤:
float i = (char)+(int)-(long)(byte) 100;
當我在Netbeans中使用自動格式來格式化代碼時,上面的聲明格式如下:
float i = (char) +(int) -(long) (byte) 100;
請幫助我理解這段代碼是如何編譯的?
它基本上只是一系列演員和一元+
和-
。
float i = (char) +(int) -(long) (byte) 100;
它相當於
byte tmp1 = (byte) 100;
long tmp2 = (long) tmp1;
long tmp3 = -tmp2;
int tmp4 = (int) tmp3;
int tmp5 = +tmp4;
char tmp6 = tmp5;
float i = tmp6;
最后的賦值是從char
到float
,這是一個擴展的原始轉換。 請參閱JLS第5章:轉換和促銷
對原始類型的19個特定轉換稱為擴展原始轉換:
- byte to short,int,long,float或double
- 短,int,long,float或double
- char到int,long, float或double
- int到long,float或double
- 長期浮動或加倍
- 漂浮加倍
考慮一下這樣:
float i = ((char) +((int) -((long) ((byte) 100))));
每個步驟都會將結果轉換為自己的類型。 所以,令人驚訝的是100因為所有這些中間類型演員而變成了65436.0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.