當心它----「複合賦值運算」

 這是今天在開發當中遇到的問題,雖然不是很大,但仍是花了一點時間去琢磨。http://bbs.itheima.com/thread-23776-1-1.html?fstgj之前的學習網站,-全套java視頻教程,須要的本身看下,能夠去這個網站下載,下載視頻免費,不須要註冊和作什麼任務 html

      嗯,好了。先看一段源代碼:  java

short value=2; value-=2;

     源碼就是上面這個樣子的,我動手寫的時候由於理解的問題,把代碼改爲了這個樣子: 性能

short value=2; value=value-2;

    這時候編譯器就和我槓上了,報第二行有錯。想一想也對, value 變量和一個整型運算後 Java 會自動將運算結果提高到 int 類型,這和 value 定義的時候的 short 類型的產生矛盾。 學習

 

提供的修改意見有兩個: 網站

    1)把 value的類型改成 int  spa

    2)把value-2的運算結果強制轉換爲 short 類型; code

第一段代碼沒有報錯,那說明類型轉換沒有問題,就是說複合賦值運算裏面有個偷偷摸摸類型轉換的過程,但到底是怎樣轉換的,採用的修改意見1)仍是2)? 視頻

 

翻翻了手頭的書,我的理解以下: htm

       第一段代碼並非我理解的:  value-=2  和 value=value-2 劃等號; blog

      準確的表述應該是這樣的:       value-2  等價於 value=(value 的類型) (value-2) 

      因此說在複合賦值運算當中,會自動將他計算的結果值強制類型轉換爲左側的類型。

      固然結果和左側類型相同的時候就不會有任何的影響。

 

順藤摸瓜,若是左邊的類型要比計算結果的那個類型範圍要小?確定會喪失精確,形成Bug;

   好比:

複製代碼
short value=2; //系統自動隱身的類型轉換  value+=80000; //從高位截斷,發生了溢出,結果不是你想要的  System.out.println(valueA);
複製代碼

 

總結一下:

      優勢:複合賦值運算方便,簡單。並且頗有效率,在性能上面也有優點;

      缺點:在你最不設防的精度問題上面背後給你一槍。

               因此在你運算符左邊是個小範圍而右邊的運算結果是個大範圍的時候,必定要當心。

相關文章
相關標籤/搜索