計算機的最基本用途之一就是執行數學運算,做爲一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。java
咱們把運算符具體分爲:算數運算符,比較運算符,邏輯運算符,位運算符,賦值運算符,條件運算符,instanceof 運算符。編碼
算術運算符用在數學表達式中,它們的做用和在數學中的做用同樣。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--)); }
比較運算符的結果必定是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
操做符 | 名稱 | 描述 |
---|---|---|
&& | 短路與 | 當且僅當兩個操做數都爲真,條件才爲真。 |
& | 邏輯與 | 當且僅當兩個操做數都爲真,條件才爲真。 |
| | | 短路或 | 若是任何兩個操做數任何一個爲真,條件爲真。 |
| | 邏輯或 | 若是任何兩個操做數任何一個爲真,條件爲真。 |
! | 邏輯非 | 用來反轉操做數的邏輯狀態。若是條件爲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)); }
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
總結一下,原則上,按位左移時,原則捨棄高位,低位補零;有符號按位右移,原則捨棄低位,符號位不變,其他高位補零;無符號按位右移,原則捨棄低位,高位補零。再次強調,作位移運算時,是按補碼來進行運算的
操做符 | 名稱 | 描述 |
---|---|---|
= | 賦值 | 右操做數的值賦給左側操做數 |
+= | 加和賦值 | 左操做數和右操做數相加賦值給左操做數 (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) |
基本的賦值運算符是「=」。他的優先級別低於其餘的運算符,因此對該運算符每每最後讀取,他不是「等於」,它的做用是將一個表達式的值賦給一個左值。所謂左值是指一個能用於賦值運算左邊的表達式。左值必須可以被修改,不能是常量,以上其餘是複合的賦值運算符,又稱爲帶有運算的賦值運算符,也叫賦值縮寫。等同與先按運算符運算後再把運算結果付給左值(見表格)。具體運算方法上邊兒已經羅列,此處再也不贅述
條件運算符也叫三目運算符
語法:
(條件) ? 結果一 : 結果二;
當條件成立,執行結果一,不然執行結果二。,「?」前的值必須是true或flase
咱們給出例子:
if(a<b) min=a; else min=b; 能夠用下面的三目運算符來處理 min = a<b ? a : b;
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
在一個表達式中可能包含多個有不一樣運算符鏈接起來的、具備不一樣數據類型的數據對象;因爲表達式有多種運算,不一樣的運算順序可能得出不一樣結果甚至出現錯誤運算錯誤,由於當表達式中含多種運算時,必須按必定順序進行結合,才能保證運算的合理性和結果的正確性、惟一性。相同優先級中,按結合順序計算。
一般優先級由高到底的順序依次是:1. 括號級別最高,逗號級別最低;2. 單目 > 算術 > 位移 > 關係 > 邏輯 > 三目 > 賦值。3. 除了單目運算符、賦值運算符和條件運算符,其餘的運算符都是從左到右結合的。