咱們知道,在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的是一個錯誤的值!最可惡的是,由於是強制類型轉換以後進行的賦值,因此編譯器並不報錯,從而致使不少人掉到坑裏還不知道!
經過這個篇文章,你們能夠看到:一個簡單的複合賦值運算符居然也「暗藏殺機」,咱們平時編程必定要當心哦!編程