Java雜記2—運算子和表示式

冰洋發表於2018-04-27

運算子

前言

對於java而言,資料型別有多種,而運算也是有多種的,本文會為大家講解常見的運算子。

主要有:

  • 數學運算:加減乘除
  • 比較運算:大小比較
  • 邏輯運算:布林值運算

運算子

賦值運算子

在之前的文章中我們講過,宣告變數就相當於在記憶體中得到了一塊兒地,那麼這塊兒地上存什麼,需要我們將資料賦值上去,賦值就是把這塊位置的內容設為一個確定的值。

對變數進行賦值我們需要使用到的就是賦值運算子,常見的賦值運算子是=,注意:在java中=是用來賦值的。

數學運算子

數學運算子有加減乘除,符號分別是+-*/,另外還有取模運算子%,以及自增(++)和自減(–)運算子。取模運算適用於整數和字元型別,其他數學運算適用於所有數值型別和字元型別。加減乘除大部分情況和直觀感覺是一樣的,都很容易理解,需要注意的是++ -- 以及和賦值運算子結合之後的+= -=。

注意型別的範圍

在使用整數進行數學運算的時候,我們需要注意型別的範圍,一旦計算結果超出了表示範圍又沒有用合適的型別接收就會出現問題。什麼意思的呢?看下面的例子

int a = 2147483647*2; //2147483647是int能表示的最大值
複製程式碼

此時列印a的結果是-2。解決方式是用long接收結果。

為什麼會出現這樣的情況?

需要從二進位制說起,內容稍多,所以細節就不說來,簡單說就是二進位制加減法,當計算結果超出表示範圍的時候,最高位往往是1,會被看做負數。

自動型別提升

在進行數學運算的時候我們需要注意的就是型別自動提升的問題,在之前講解資料型別的時候提到過自動型別提升,本文不做過多的講解。

  • 如果參與運算的值有double,結果自動提升為double
  • 如果參與運算的值有float,結果自動提升為float
  • 如果參與運算的值有long,結果自動提升為long
  • 其它情況(byte,short,char),結果預設提升為int
+= -=

當+ 和 賦值= 結合起來之後就相當於運算之後賦值,例如a+=2就相當於a=a+2,這兩種方式沒有結果上的區別,在使用的過程中也不會可以的區分,但是他們之間還是有區別的。

上文我們說到,在進行操作的時候,會發生自動型別提升,byte型別的a加10會變為int,*通過+=的寫法不會發生自動型別提升,同樣-= = /=都不會發生自動型別提升。

自增(++)/自減(--)

在JDK中為我們提供了自增運算子++,自減運算子--,首先需要說明的是++ -- 也不會發生自動型別提升。

例如:a++相當於a+=1相當於a=a+1。

a++是一個表示式 ,那麼a++就會有一個表示式的計算結果,這個計算結果就是a的舊值(加1前的值)。相對的,++a表示式的計算結果a加1後的值。所以他們的本質區別是:表示式的值(運算結果) 是加1前的變數的值還是加1後的變數的值(自減也是如此)。換句話說:a++計算之後a的值確實加了1 ,但是a++這個表示式整體的值是加1之前的值。

a++ 沒有 ++a 快 ++a省去一個暫存器

另自增自減是非執行緒安全的,自增自減運算子包含兩個操作:一個加1(減1)的操作和一個賦值的操作,不是原子操作,因此,在多執行緒下,如果你要對共享變數實現自增自減操作,就要加鎖,或者使用JDK提供的原子操作類(如AtomincIntegerAtomicLong等)提供的原子性自增自減方法。

比較運算子

也叫作關係運算子,會形成布林表示式。主要用來計算兩個值之間的關係,結果是一個布林型別(boolean)的值。適用於所有數值型別和字元型別。

比較操作符有:大於(>),大於等於(>=),小於(<),小於等於(<=),等於(==),不等於(!=)。

在此處需要注意的是等於。等於使用兩個等號==,而不是一個等號(=)。一個等號(=)表示賦值操作。

邏輯運算子

邏輯運算根據資料的邏輯關係,生成一個布林值true或者false。邏輯運算只可應用於boolean型別的資料,但比較運算的結果是布林值,所以其他型別資料的比較結果可進行邏輯運算。

邏輯運算子具體有:

  • 與(&):兩個都為true才是true,只要有一個是false就是false
  • 或(|):只要有一個為true就是true,都是false才是false
  • 非(!):針對一個變數,true會變成false, false會變成true
  • 異或(^):兩個相同為false, 兩個不相同為true
  • 短路與(&&)
  • 短路或 (||)

邏輯運算的大部分都是比較直觀的,需要注意的是&和&&,以及|和||的區別。

參考資料

http://www.cnblogs.com/jinggod/p/8424808.html


我不能保證每一個地方都是對的,但是可以保證每一句話,每一行程式碼都是經過推敲和斟酌的。希望每一篇文章背後都是自己追求純粹技術人生的態度。

永遠相信美好的事情即將發生。

相關文章