Java千問:關於Java語言複合賦值運算符的兩個問題,快來瞧瞧!

我們知道,在Java以及很多高級編程語言當中,都有一種運算符叫做複合賦值運算符。複合賦值運算符由兩個符號組成,它所能完成的運算操作也分爲兩步:第一步是運算,第二步是賦值。比如說:

上面的這兩條語句相當於

但是,如果碰到下面這樣的情況,a的值該應該是多少呢?

有人認爲應該按以下方式來計算,因爲我們都知道,在四則運算規則中,遵循“先乘除,後加減”的原則

按照這樣的方式來計算,得到a的值應該是7,但實際運行程序所得到的結果是8。這是爲什麼呢?

就是因爲複合賦值運算符在完成運算的時候,遵循一個規則:把“=”右邊當作整體!也就是說,剛纔的運算和賦值操作應該被解釋爲以下形式

因此,按照這種方式,“=”右邊的“3+1”應該被當作整體,優先進行運算,所以得到的最終計算結果就是變量a的值爲8。

我們再來看另外一個問題,這一次,我們把變量a的類型由原來的int改爲short。

我們這麼寫代碼沒有任何問題,能夠順利通過編譯。但是,如果我們沒有使用複合賦值運算符,而是按如下所示的方式編寫代碼

在這種情況下,大家可以看到代碼不能通過編譯。我們把一個算術表達式的運算結果賦值給byte或者是short類型的變量,有時候會引起編譯錯誤,所以按這種方式寫代碼會導致編譯錯誤。關於引起這種錯誤的原因,大家可以看我的另一篇文章《Java千問:Java語言中爲byte和short類型變量賦值爲啥會報錯?》,該文對此現象有詳細解釋。我們現在重點討論使用複合賦值運算符進行操作的時候,同樣會有給short類型變量賦值的操作,爲什麼就不報錯呢?原因就是:使用複合賦值運算符在對變量進行賦值的時候,編譯器會“暗地裏”加上一個強制類型轉換的操作。也就是說,使用複合賦值運算符進行操作的時候,實際上等同於如下寫法

這種強制類型轉換,其實有可能讓我們的程序在不經意間產生莫名其妙的錯誤,請看下面的例子

這一次,我們把a的初始值由原來的2改成了20000,並且在代碼中還加入了輸出a的語句,那麼,輸出結果會是多少呢?首先來講,這段代碼並沒有報錯,那麼這個輸出結果會讓人很多人大吃一驚,它並不是我們想象的80000,而是竟然輸出了14464!

之所以會輸出這樣的結果,就是因爲80000已經超出了short類型數據的最大值,而我們強制把這個已經超過最大值的“80000”經過強制類型轉換賦值給short變量,就會產生“溢出”,最終導致實際賦給變量a的是一個錯誤的值!最可惡的是,因爲是強制類型轉換之後進行的賦值,所以編譯器並不報錯,從而導致很多人掉到坑裏還不知道!

通過這個篇文章,大家可以看到:一個簡單的複合賦值運算符竟然也“暗藏殺機”,我們平時編程一定要小心哦!

如果想系統學習Java編程,可以點擊這裏觀看我在本站的視頻課程,有問題也可以加入我的QQ羣291839907一起討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章