8. 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. 除了單目運算符、賦值運算符和條件運算符,其他的運算符都是從左到右結合的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM