Java運算符
計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。
我們把運算符具體分為:算數運算符,比較運算符,邏輯運算符,位運算符,賦值運算符,條件運算符,instanceof 運算符。
1. 算數運算符
算術運算符用在數學表達式中,它們的作用和在數學中的作用一樣。
| 操作符 | 名稱 | 描述 |
|---|---|---|
| + | 加法 | 相加運算符兩側的值 |
| – | 減法 | 左操作數減去右操作數 |
| * | 乘法 | 相乘操作符兩側的值 |
| / | 除法 | 左操作數除以右操作數 |
| % | 取余 | 左操作數除以右操作數的余數 |
| ++ | 自增 | 操作數的值增加1 |
| — | 自減 | 操作數的值減少1 |
以下代碼:
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
另外,進行除法運算時,若兩個操作數是整型的,結果也會是整型的,舍棄掉小數部分;如果有一個數是浮點數,結果將自動轉型為浮點型。進行取余運算時,若兩個操作數是整型的,結果也會是整型的,如果有一個數是浮點數,結果將自動轉型為浮點型
**其中,自加和自減運算符針對一個數值本身的運算;且前綴自增自減(++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類型,也叫關系運算符
| 操作符 | 名稱 | 描述 |
|---|---|---|
| > | 大於 | 相加運算符兩側的值 |
| < | 小於 | 左操作數減去右操作數 |
| == | 等於 | 相乘操作符兩側的值 |
| >= | 大於等於 | 左操作數除以右操作數 |
| <= | 小於等於 | 左操作數除以右操作數的余數 |
| != | 不等於 | 操作數的值增加1 |
如,
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()來比較字面量是否相等。
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. 除了單目運算符、賦值運算符和條件運算符,其他的運算符都是從左到右結合的。
大家可參考網絡上總結較好的優先級口訣用來輔助記憶和使用,但要記住所有的優先級順序還是有點兒困難的,實際開發中,建議大家使用小括號輔助進行優先級管理,也可以使計算過程更加清晰,提高可讀性
