1. 程式人生 > >java:關於short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的簡單資料型別轉換問題的理解

java:關於short s1=1;s1=s1+1;short s1=1;s1+=1;short s3=s1+s2;中存在的簡單資料型別轉換問題的理解

脫離了開發環境的提示,發現自己對有些java的基礎東西掌握的都不紮實,今天看到一個關於java資料型別轉換部分的面試題。

面試題的內容大概是這樣:short s1=1;s1=s1+1;這兩句程式碼有什麼問題?short s1=1;s1+=1;這兩句程式碼有什麼問題?short s1=1,s2=1;short s3=s1+s2;這兩句程式碼有什麼問題?

下面我就對這三個問題按照自己的理解以及參考做出解釋:

解釋之前先說一些java中的基本資料型別轉換的規則:高位轉地位需要強制轉換,地位轉高位是自動轉換,表示式兩側的轉換規則是向左邊的型別看齊。

一、short s1=1;s1=s1+1;

這兩句程式碼的s1=s1+1存在資料型別轉換問題,表示式右邊:s1是short型,1是int型(1會被自動歸為int型),二者相加,首先s1會被自動轉為int型,相加的結果也就為int型。然而表示式的左邊:s1是short型。此時就需要把表達時的右側的資料型別強制轉換為shor型,所以s1=s1+1;存在問題,會報出編譯錯誤,正確的寫法應該是s1=(short)(s1+1);

二、short s1=1;s1+=1;

首先說一下,這兩句程式碼沒有編譯錯誤,結果也是正確的,那麼,

有些人看到這兩句程式碼會說,這個和剛才不是一樣的嗎,如果簡單的認為s1+=1和s1=s1+1完全相同,那就錯了。java語言規範中關於複合賦值的解釋是這樣的:E1 op=E2等價於

E1=(T)(E1 op E2),這裡的T是E1的資料型別,看到這裡 ,大家應該豁然開朗了,原來這個複合賦值是自帶了隱式的強制型別轉換的。

三、short s1=1,s2=1;short s3=s1+s2;

這兩句程式碼也有編譯錯誤,有些人會說了,難道同類型的資料還需要型別轉換?答案是否定的,那麼這裡為什麼會有編譯錯誤呢,報錯的原因主要是從資料安全方面考慮的,s1+s2的預設型別是int,因為如果s1的值接近short型別取值範圍的最大值,同時s2的值也接近short型別取值範圍的最大值,那麼s1+s2的肯定超出了short的取值範圍,此時二者之和就是int型的資料,此時就需要強制把左邊的int型資料轉換為右邊的short型。有些人又說了,我明明寫的s1為1,s2也為1,那為什麼還報錯,呵呵呵呵,因為此時還不知道s1和s2的值到底是多少,此處省去n個字。所以這兩句程式碼正確的寫法應該是short s1=1,s2=1;short s3=(short)(s1+s2);