8. Java的運算符

計算機的最基本用途之一就是執行數學運算,做爲一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。java

咱們把運算符具體分爲:算數運算符,比較運算符,邏輯運算符,位運算符,賦值運算符,條件運算符,instanceof 運算符。編碼

1. 算數運算符

算術運算符用在數學表達式中,它們的做用和在數學中的做用同樣。spa

操做符 名稱 描述
+ 加法 相加運算符兩側的值
減法 左操做數減去右操做數
* 乘法 相乘操做符兩側的值
/ 除法 左操做數除以右操做數
% 取餘 左操做數除以右操做數的餘數
++ 自增 操做數的值增長1
自減 操做數的值減小1

如下代碼:code

public static void main(String[] args) { int a = 5; int b = 10; System.out.println("「+」 運算:"+(a+b)); System.out.println("「-」 運算:"+(a-b)); System.out.println("「*」 運算:"+(a*b)); System.out.println("「/」 運算:"+(a/b)); System.out.println("「%」 運算:"+(a%b)); System.out.println("「++」 運算:"+(a++)); System.out.println("「--」 運算:"+(a--)); } 

輸出結果:
「+」 運算:15
「-」 運算:-5
「*」 運算:50
「/」 運算:0
「%」 運算:5
「++」 運算:5
「–」 運算:6對象

另外,進行除法運算時,若兩個操做數是整型的,結果也會是整型的,捨棄掉小數部分;若是有一個數是浮點數,結果將自動轉型爲浮點型。進行取餘運算時,若兩個操做數是整型的,結果也會是整型的,若是有一個數是浮點數,結果將自動轉型爲浮點型token

**其中,自加和自減運算符針對一個數值自己的運算;且前綴自增自減(++a,–a)是先進行自增或者自減運算,再進行表達式運算。後綴自增自減(a++,a–)是先進行表達式運算,再進行自增或者自減運算。咱們給出例子:數學

public static void main(String[] args) { int a = 5; int b1 = 10; int b2 = 10; int c1 = 10; int c2 = 10; System.out.println("前綴自增b1參與表達式計算後值爲:"+(a*++b1)); System.out.println("後綴自增b2參與表達式計算後值爲:"+(a*b2++)); System.out.println("前綴自減b1參與表達式計算後值爲:"+(a*--c1)); System.out.println("後綴自減b2參與表達式計算後值爲:"+(a*c2--)); } 

2. 比較運算符

比較運算符的結果必定是boolean類型,也叫關係運算符string

操做符 名稱 描述
> 大於 相加運算符兩側的值
< 小於 左操做數減去右操做數
== 等於 相乘操做符兩側的值
>= 大於等於 左操做數除以右操做數
<= 小於等於 左操做數除以右操做數的餘數
!= 不等於 操做數的值增長1

如,it

public static void main(String[] args) { int a = 5; int b = 10; System.out.println(a > b ); System.out.println(a < b ); System.out.println(a == b ); System.out.println(a >= b );**** System.out.println(a <= b); System.out.println(a != b ); } 

輸出結果:
false
true
false
false
true
true
注意,比較運算符「==」用來比較基本數據類型是比較的是值是否相等,比較引用數據類型是比較的是引用是否相等,引用數據類型用equals()來比較字面量是否相等。io

3. 邏輯運算符

操做符 名稱 描述
&& 短路與 當且僅當兩個操做數都爲真,條件才爲真。
& 邏輯與 當且僅當兩個操做數都爲真,條件才爲真。
| | 短路或 若是任何兩個操做數任何一個爲真,條件爲真。
| 邏輯或 若是任何兩個操做數任何一個爲真,條件爲真。
! 邏輯非 用來反轉操做數的邏輯狀態。若是條件爲true,則邏輯非運算符將獲得false

邏輯運算符中,「與」運算符和「或」運算符都有兩個,「&&」咱們稱之爲短路與。「||」咱們稱之爲短路或,短語與「&&」從左到右一次判斷,遇到false則中止判斷,得出結果未false;邏輯與「&」從左到右一次判斷,直至結束。短語或「||」從左到右一次判斷,遇到true則中止判斷,得出結果未true;邏輯或「|」從左到右一次判斷,直至結束。咱們給出例子:

public static void main(String[] args) { int a = 5; int b = 10; //短路與,前一個表達式的值爲false,不在判斷下一個表達式,故a++不執行 System.out.print((a>b)&&(a++ == 1)); System.out.println(" a的值:"+ a); //邏輯與,前一個表達式的值爲false,仍依次判斷下一個表達式 System.out.print((a>b)& (a++ == 1)); System.out.println(" a的值:"+ a ); //短路或,前一個表達式的值爲true,不在判斷下一個表達式,故a++不執行 System.out.print((a<b)|| (b++ == 1)); System.out.println(" b的值:"+ b ); //邏輯或,前一個表達式的值爲true,仍依次判斷下一個表達式 System.out.print((a<b)| (b++ == 1)); System.out.println(" b的值:"+ b ); //非運算符 System.out.print(!(a<b)); } 

4. 位運算符

Java定義了位運算符,應用於整數類型(int),長整型(long),短整型(short),字符型(char),和字節型(byte)等類型。位運算符做用在全部的位上,而且按位運算。

操做符 名稱 描述
& 按位& 若是相對應位都是1,則結果爲1,不然爲0
| 按位或 若是相對應位都是0,則結果爲0,不然爲1。
^ 異或 若是相對應位值相同,則結果爲0,不然爲1
~ 按位取反 翻轉操做數的每一位,即0變成1,1變成0。結果爲: -(X+1)
<<   按位左移 |一般格式爲:value << num,value按位左移num位
>> 有符號按位右移 一般格式爲:value >> num,value按位右移num位。
>>> 無符號按位右移 一般格式爲:value >> num,value按右移num位,移動獲得的空位以零填充。

咱們給出例子:

public static void main(String[] args) { int a= 10; int b = 20; //a轉化成二進制表示爲:1010;b轉化爲二進制表示爲:10100 //按位運算時,咱們把a表示爲:01010 System.out.println(a&b); //按位與運算,有零則爲零,都爲1則表示爲1,與的結果爲:00000,即十進制的0 System.out.println(a|b); //按位或運算,有1則爲1,都爲0則表示爲0,或的結果爲:11110,即十進制的30 System.out.println(a^b); //按位或運算,對應位置相同則爲0,不然爲1,取反的結果爲:11110,即十進制30 } 

運行結果:
0
30
30

下面,咱們來講一下按位取反,計算機內部都是以補碼的形式在作數學運的,而咱們所用的編碼規則,例如原碼、反碼則是咱們自定義的,用來方便和計算機中的補碼來造成轉化。故而,咱們在進行按位取反是要把原碼或者反碼轉化成補碼的形式。正數的反碼和補碼與原碼相等; 負數的反碼是符號位不變,其他按位取反,補碼爲反碼+1。負數的最高符號位爲1。
如,

public static void main(String[] args) { int a= 10; int b= -10; System.out.println(~a); System.out.println(~b); } 

運行結果爲:-11,9。 分析以下: a爲正數,其補碼形式與原碼相同,表示爲:00001010,按位取反後爲11110101,注意,此時爲補碼形式,轉化爲反碼錶示爲,11110100,再轉化爲原碼錶示爲:10001011,即十進制的-11.一樣的,b爲負數,其補碼錶示爲:11110110,按位取反後爲00001001,此時依然爲補碼形式,轉化爲原碼即其自己00001001,即十進制的9。故,按位取反後的結果可表示爲-(X+1)

接下來,咱們給出例子來看一下位移運算符

public static void main(String[] args) { int a= 10; int b = -10; //int爲4個字節,也就是32位,爲了簡化a表示爲:00001010, // b爲負數咱們表示爲:1000 0000 0000 0000 0000 0000 0000 1010 //b的補碼形式爲 1111 1111 1111 1111 1111 1111 1111 0110 System.out.println( a<<1 ); //按位左移,原則捨棄高位,低位補零表示爲:00010100,即20 System.out.println(a>>1); //按位右移,原則捨棄低位,高位補零表示爲:00000101,即5 System.out.println(a>>1); //按位右移,原則捨棄低位,高位補零表示爲:10000101,即5 System.out.println(a>>>1); //按位右移,原則捨棄低位,高位補零表示爲:0000010,即5 System.out.println(b>>1); //有符號按位右移,原則捨棄低位,符號位不變,其他高位補零原碼錶示爲: // 1000 0000 0000 0000 0000 0000 0000 0101,即-5 System.out.println(b>>>1); //無符號按位右移,原則捨棄低位,高位補零(補碼=原碼)表示爲: // 0111 1111 1111 1111 1111 1111 1111 011,即十進制的,2147483643 } 

輸出結果:
20
5
5
5
-5
2147483643
總結一下,原則上,按位左移時,原則捨棄高位,低位補零;有符號按位右移,原則捨棄低位,符號位不變,其他高位補零;無符號按位右移,原則捨棄低位,高位補零。再次強調,作位移運算時,是按補碼來進行運算的

5. 賦值運算符

操做符 名稱 描述
= 賦值 右操做數的值賦給左側操做數
+= 加和賦值 左操做數和右操做數相加賦值給左操做數 (a+=b 等同於 a = a+b)
-= 減和賦值 左操做數和右操做數相減賦值給左操做數 (a-=b 等同於 a = a-b)
*= 乘和賦值 左操做數和右操做數相乘賦值給左操做數 (a*=b 等同於 a = a*b)
\/= 除和賦值 左操做數和右操做數相除賦值給左操做數 (a/=b 等同於 a = a/b)
(%)= 取模和賦值 左操做數和右操做數取模後賦值給左操做數 (a%=b 等同於 a = a%b)
<< = 左移位賦值 左移位賦值運算符 (a<<=b 等同於 a = a<<b)
>> = 右移和賦值 右移位賦值運算符 (a>>=b 等同於 a = a>>b)
^ = 除和賦值 按位與賦值運算符 (a^=b 等同於 a = a^b)
&= 除和賦值 按位異或賦值操做符 (a&=b 等同於 a = a&b)
| = 除和賦值 按位或賦值操做符 (a|=b 等同於a = a|b)

基本的賦值運算符是「=」。他的優先級別低於其餘的運算符,因此對該運算符每每最後讀取,他不是「等於」,它的做用是將一個表達式的值賦給一個左值。所謂左值是指一個能用於賦值運算左邊的表達式。左值必須可以被修改,不能是常量,以上其餘是複合的賦值運算符又稱爲帶有運算的賦值運算符,也叫賦值縮寫。等同與先按運算符運算後再把運算結果付給左值(見表格)。具體運算方法上邊兒已經羅列,此處再也不贅述

6. 條件運算符

條件運算符也叫三目運算符

語法:

(條件) ? 結果一 : 結果二; 

當條件成立,執行結果一,不然執行結果二。「?」前的值必須是true或flase
咱們給出例子:

if(a<b) min=a; else min=b; 能夠用下面的三目運算符來處理 min = a<b ? a : b; 

7. instanceof 運算符

instanceof運算符能夠肯定對象是否屬於一個特定的類.該運算符是二目運算符,左邊的操做元是一個對象,右邊是一個類,當左邊的對象是右邊的類或子類建立的對象時,該運算符運算的結果是true,不然是false。,使用格式:( Object reference variable ) instanceof (class/interface type)

咱們給出例子:

public static void main(String[] args) { String a = "name"; System.out.println(a instanceof String); System.out.println(a instanceof Object); } 

輸出結果:true,true

8. 運算符優先級

在一個表達式中可能包含多個有不一樣運算符鏈接起來的、具備不一樣數據類型的數據對象;因爲表達式有多種運算,不一樣的運算順序可能得出不一樣結果甚至出現錯誤運算錯誤,由於當表達式中含多種運算時,必須按必定順序進行結合,才能保證運算的合理性和結果的正確性、惟一性。相同優先級中,按結合順序計算。

一般優先級由高到底的順序依次是:1. 括號級別最高,逗號級別最低;2. 單目 > 算術 > 位移 > 關係 > 邏輯 > 三目 > 賦值。3. 除了單目運算符、賦值運算符和條件運算符,其餘的運算符都是從左到右結合的。

相關文章
相關標籤/搜索