1. 程式人生 > >JAVA-初步認識-第二章-算術運算符2

JAVA-初步認識-第二章-算術運算符2

字節 如何 原因 最終 ges java 相同 我們 相加

一. 介紹其他類型的運算符。

除了前面介紹的+,-,*,/,%,+連接符外,還有兩種++,--。

二. ++自增

定義:在原有數據的基礎上加一,在賦給原有數據。

對自增運算進行了演示,結果如下:對於++的使用方法還不熟悉。

技術分享

技術分享

註意:自增運算並不簡單,相同的輸出結果可以有兩種書寫方法。例如:寫成a++,或者++a都是可以的。這後面存在著深刻的原理,並非看著那麽簡單。

這裏面實際上就是一個優先級的問題。a++是a先參與左側的運算,然後a再加一,而++a是不管左側是什麽,先進行a加一,再將a代入左側的運算。++a顯示出自增的優先級是高於算術運算符的。(後期對於運算符的種類要進行深究。)

例子:a=3; b=a++;過程是,b=a=3,然後a=a+1=4.

a=3; b=++a;過程是,a=a+1=4, 然後b=a=4;

b*a++ b*a a=a+1

b*++a a+1 b*a

無論是a++還是++a,a進行一次運算後都是加一,但是左側的賦值對象的值會產生變化。

在視頻的講解中,我們對於變量的定義又有了新的認識。可以先不進行初始定值,只要在最後的輸出中變量有一個具體的值即可。

技術分享

還有哪怕我定義的變量不全,只要輸出語句中,沒有用到該變量,DOS也不會報錯。如下:

技術分享

三. 對a++進行底層的分析

以int a=3,b; b=a++; 為例,進行分析。開始,是這麽描述的:a先進行其他的運算後(在這裏就是先進行賦值),再進行自增。但是,就賦值語句來說,應該是先將右側的計算結束,最終再進行賦值。看著前後貌似是矛盾,正確的底層運算是這樣的,a在進行自增之前,原有的指先進行了保存,然後進行a的自增,接著計算機再將保存的原有a值賦給b。

下面的示例中,更能說明這樣的問題底層運算的先後順序問題。

技術分享

註意:雖然這邊正確的計算順序,我們已經知道,但是計算機的底層運算為什麽是這樣的?目前所談論的都是如何正確地做計算,並沒有說這麽做的原因。

四. 賦值運算符

前面我們見識過最簡單的,就是=,其實還有很多擴展:+=,-=,*=,/=,%=。

舉例來說明擴展運算符的功能,a+=2;這個意思就是a=a+2, 這是一個簡寫的符號。

之所以會有這些擴展的,賦值運算符的出現其實是有來源的,我們下面回顧下之前講過的變量的運算。

技術分享

上面的java源程序中,我們從第一步進行分析。byte a=3; 這裏3是int類型,將其賦值給byte類型的變量a,計算機會進行判斷,看這個四個字節大小的常量,其真正的值是否在byte的範圍內,如果在的話,進行強制類型轉換,從而賦值給byte類型的變量a。a=a+4,這裏將byte類型的變量和int類型的常量4進行相加,會自動提升類型到int型,且最終會得到一個結果,但這個結果是不確定的,可能大於byte的範圍,也可能小於,所以強制將int類型的結果轉為byte類型賦值,會有一個精度缺失的可能。

為了杜絕上面的這種精度缺失,擴展的,賦值運算符就是為了這個誕生的。

技術分享

采用+=的形式,在這裏就不會有精度的缺失。為什麽 a+=4;和a=a+4的結果不一樣?a+=4和a=3一樣,是一個經過判斷後的,系統自動進行強轉賦值語句,是賦值運算所具備的特點。而a=a+4沒有強轉的過程,需要手動書寫(byte)(a=a+4)才行,不能強轉相當於將int輸入給byte,這就是錯誤語句。驗證結果如下所示:

技術分享

JAVA-初步認識-第二章-算術運算符2