Java運算符概述


Java運算符優先級:

序列號

符號

名稱

結合性(與操作數)

目數

說明

1

.

從左到右

雙目

 

( )

圓括號

從左到右

   

[ ]

方括號

從左到右

   

2

+

正號

從右到左

單目

 

-

負號

從右到左

單目

 

++

自增

從右到左

單目

前綴增,後綴增

- -

自減

從右到左

前綴減,後綴減

~

按位非/取補運算

從右到左

單目

 

邏輯非

從右到左

單目

!”不可以與“=”聯用

3

*

從左到右

雙目

 

/

從左到右

雙目

整數除法:取商的整數部分,小數部分去掉,不四捨五入

%

取餘

從左到右

雙目

 

4

+

從左到右

雙目

 

-

從左到右

雙目

 

5

<<

左移位運算符

從左到右

雙目

 

>>

帶符號右移位運算符

從左到右

雙目

 

>>>

無符號右移

從左到右

雙目

 

6

<

小於

從左到右

雙目

關係運算符“大於”說明

<=

小於或等於

從左到右

雙目

 

>

大於

從左到右

雙目

 

>=

大於或等於

從左到右

雙目

 

instanceof

確定某對象是否屬於指定的類

從左到右

雙目

 

7

==

等於

從左到右

雙目

關係運算符“==”說明

!=

不等於

從左到右

雙目

 

8

&

按位與

從左到右

雙目

 

9

|

按位或

從左到右

雙目

 

10

^

按位異或

從左到右

雙目

 

11

&&

短路與

從左到右

雙目

 

12

||

短路或

從左到右

雙目

 

13

? :

條件運算符

從右到左

三目

 

14

=

賦值運算符

從右到左

雙目

 

+=

混合賦值運算符

 

-=

 

*=

 

/=

 

%=

 

&=

 

|=

 

^=

 

<<=

 

>>=

 

>>>=

 

說明:

1、 該表中優先級按照從高到低的順序書寫,也就是優先級爲1的優先級最高,優先級14的優先級最低。

2、 結合性是指運算符結合的順序,通常都是從左到右。從右向左的運算符最典型的就是負號,例如3+-4,則意義爲3加-4,符號首先和運算符右側的內容結合。

3、 instanceof作用是判斷對象是否爲某個類或接口類型;

4、 注意區分正負號和加減號,以及按位與和邏輯與的區別其實在實際的開發中,不需要去記憶運算符的優先級別,也不要刻意的使用運算符的優先級別,對於不清楚優先級的地方使用小括號去進行替代,示例代碼:

int m = 12;

int n = m << 1 + 2;

int n = m << (1 + 2); //這樣更直觀

這樣書寫代碼,更方便編寫代碼,也便於代碼的閱讀和維護。


1.算數運算符:

加法:+              減法:-          乘法:*          除法:/           求餘:%


2.關係(比較)運算符:

        比較運算符運算的結果是一個boolean類型的值,如果比較結果成立則爲true,否則爲false

            < :只能比較基本類型數據之間的關係,不能比較對象之間的關係。

           > : (同關係運算符“<”)

          <=: (同關係運算符“<”)

           >=: (同關係運算符“<”)

           == :若使用該運算符比較兩個對象的引用(變量),則實質上是比較兩個變量是否引用了相同的對象。所謂相同的對象是指,是否是在堆棧(Heap)中開闢的同一塊兒內存單元中存放的對象。

  若比較兩個對象的引用(變量)所引用的對象的內容是否相同,則應該使用equals()方法,該方法的返回值類型是布爾值。需要注意的是:若用類庫中的類創建對象,則對象的引用調用equals()方法比較的是對象的內容;若用自定義的類來創建對象,則對象的引用調用equals()方法比較的是兩個引用是否引用了同一個對象,因爲第二種情況equals()方法默認的是比較引用。

          != :(同關係運算符“==”)

比較運算符的運算規則和現實中的規則一樣。需要注意的問題主要有以下幾個:

boolean類型只能比較相等和不相等,不能比較大小;

int a = 10;

boolean b = (a > 3); //該條件成立,則將值true賦值給變量b

boolean c = (b == true); //條件成立,結果爲true在實際代碼中,數值、變量以及運算結果都可以直接參與比較,只是程序中爲了增強可讀性,有些時候需要將比較分開進行書寫


3.邏輯運算符:

        &&(and)      ||(or)          !(not)

     邏輯運算符的運算結果是boolean類型,參與邏輯運算的數據也必須是boolean類型;

表4-3 邏輯運算符
符號
名稱
功能說明
&&
邏輯與
兩個條件同時爲true才爲true,否則爲false
||
邏輯或
兩個條件有一個爲true則爲true,否則爲false
!
邏輯非
只操作一個數據,對數據取反
    boolean b1 = true;
 
    boolean b2 = false;
 
    boolean b3 = b1 && b2; //則b3的值是false 

    b3 = b1 || b;        //則b3的值是true 

    b3 = !b1;           //則b3的值是false

最後說一下&&和&的區別,其實在進行邏輯與運算時,既可以使用&&也可以使用&,在功能上本身沒有區別。兩者區別的位置在,對於&來說,如果左側條件爲false,也會計算右側條件的值,而對於&&來說,如果左側的條件爲false,則不計算右側的條件,這種現象被稱作短路現象;
int n = -1;
				 
boolean b1 = (n >= 0) && (n < 10);
			 
boolean b2 = (n >= 0) & (n < 10);

則對於第二行代碼來說,兩個條件都將被計算,而對於第三行代碼來說,因爲n >= 0這個條件不成立,則n < 10根本不會被執行。當然,兩者得到的最終結果是一樣的。

int n = 10;
				 
boolean b = (n < 8) && ((n = 1) != 0);
			 
int m = 10;
			 
boolean b1 = (m < 8) & ((m = 1) != 0);
			 
System.out.println(n);
			 
System.out.println(m);

結果爲:
10
1


4.位運算符

通過二進制計算,計算的結果爲原碼;

&    |    ^    ~

        int x, y = 5, z = 3;
	x = y | z;
	System.out.println(x);    //打印爲:7
	x = y & z;
	System.out.println(x);    //打印爲:1
	x = y ^ z;
	System.out.println(x);    //打印爲:6
        x = ~ y;
        System.out.println(x);    //打印爲:-6


按二進制的補碼計算:正數補碼原碼反碼相同;

y 0 1 0 1
z 0 0 1 1
y&z 0 1 1 1

對於x = ~y;由於計算的是補碼:y的補碼是0101,~y 是符號位和數值都取反,變爲了1010,即~y的補碼是1010,反碼是1001,原碼是1110,符號位去掉,即是-6;

可以記爲   y 取相反數-1;


5.移位運算符

          移位運算符就是在二進制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分爲三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移);

          在移位運算時,byte、short和char類型,在進行移位之前,都將被轉換成int類型;移位後的結果也會變成int類型,對於byte、short、char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次得到的結果相同;或者說移位符號右邊的操作數只截取其二進制的後5位(目的是防止因爲移位操作而超出int類型的表示範圍:2的5次方是32,int類型的最大範圍是32位)。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動66次和移動2次得到的結果相同,即對long類型進行移位,結果仍然是long類型,移位符號右邊的操作符只截取其二進制的後6位。

 

 << :按二進制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零;左移的規則只記住一點:丟棄最高位,0補最低位

需要移位的數字 << 移位的次數
例如: 3 << 2,則是將數字3左移2位

計算過程:
  3 << 2
  首先把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,然後把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,最後在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,則轉換爲十進制是12.數學意義:
  在數字沒有溢出的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。


>>運算規則:按二進制形式把所有的數字向右移動對應巍峨位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1;或者說:若符號位爲正,則在最高位插入0;若符號位爲負,則在最高位插入1;右移的規則只記住一點:符號位不變,左邊補上符號位
  語法格式:
  需要移位的數字 >> 移位的次數
  例如11 >> 2,則是將數字11右移2位
  計算過程:11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011,然後把低位的最後兩個數字移出,因爲該數字是正數,所以在高位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 0010.轉換爲十進制是2;
數學意義:右移一位相當於除2,右移n位相當於除以2的n次方。

  >>>運算規則:按二進制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補零。對於正數來說和帶符號右移相同,對於負數來說不同。
  或者說:無論正負,都在最高位插入0;

無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位

  無符號右移運算符>>> 只是對32位和64位的值有意義

int n = 4;  
System.out.println(n << 2);    //16
System.out.println(n >> 2);    //1
System.out.println(n >>> 2);   //1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章