1. 程式人生 > >Java Grammar(二):運算子

Java Grammar(二):運算子

### 運算子簡介 計算機自打誕生以來,用作最多的就是進行**計算**,而計算離不開運算子,所以運算子在我們的Java語言中的地位舉足輕重,我們現在就來了解一下Java給我們提供的運算子。 從運算的元素的個數來區分,可以分為一元運算子,二元運算子,三元運算子。 其中一元運算子包括: - +(正數) - -(負數) - ++(自增1) - —(自減1) - ~(按位取反) - !(邏輯取反) > 其實自增和自減也可以看成是特殊的二元運算子 二元運算子包括: - 算術運算子:`+ ,-,*,/,%` - 邏輯運算子:`&&,||` - 關係運算符:`==,!=,>,<,>=,<=` - 位運算子:`&,|,^,<<,>>,>>>` - 賦值運算子:`=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=` - instanceof運算子:`instanceof` 三元運算子就只有一種:` ?:` ![7CF6586D-17A7-43B7-BC31-A29EBDD1B23A](http://ww2.sinaimg.cn/large/006tNc79gy1g5vscu7kf5j30tq0kcgnd.jpg) 這些運算相信絕大部分已經被在座的各位所熟知,只有極個別的不是很清楚的,下面我所瞭解的一些面試熱點知識來進行講解。 ### 一些運算子的小常識 #### 自增,自減的前後位置 老生常談的一個問題,但是還是容易被搞混,自增和自減的順序前後到底有何不同: - **單獨使用**的時候,兩種**沒有**任何區別(溫馨提示:**面試的時候切記不要忘記第一點喲**) - 在**表示式**中使用的時候,字首會**先進行**+1(-1)的運算,而後綴會先運算**後進行**+1(-1); 在無視掉第一種情況的下,可以簡單記為**字首前,字尾後**。 #### 邏輯運算子的短路特性 我們在使用邏輯運算子`&&,||`的時候,可以利用邏輯運算子的短路特性減少運算次數,所謂短路特性就是**當第一個條件可以判斷最終結果的時候,就不會去判斷第二個條件** ```java A && B (當A為false,直接跳過第二個條件的判斷,判定為false) A || B (當A為true,直接跳過第二個條件的判斷,判定為true) ``` #### 三元運算子 該運算子的主要是決定哪個值應該賦值給變數。 ```java int a , b; a = 10; // 如果 a 等於 1 成立,則設定 b 為 20,否則為 30 b = (a == 1) ? 20 : 30; System.out.println( "Value of b is : " + b ); // 如果 a 等於 10 成立,則設定 b 為 20,否則為 30 b = (a == 10) ? 20 : 30; System.out.println( "Value of b is : " + b ); ``` #### instanceof 該運算子用於操作物件例項,檢查該物件是否是一個特定型別(類型別或介面型別)。 ```java Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); ``` ### 位運算子 位運算子可能在我們日常中使用的並不是很多,算是一個小盲區。但是其實這個運算子還是非常的重要的,我們首先來了解一下運算的機制,與其他運算子不同的是,位運算子是要講數值轉換成二進位制後,再進行運算。 `&` ![95D04C0D-1F8E-483D-9737-7FA44129BE31](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsebfv8uj30o00d8wht.jpg) `|` ![AD20CC8F-CAFD-4C48-94BD-ABED28D279AE](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsej2kc3j30qi0cqdj9.jpg) `^`是按位異或運算子,只有兩個對應的運算位不一致的時候,對應計算出的位置為1,否則為0。 `~`是按位取反運算子,將每一位取反(1 -> 0,0 ->1) ![57BB3EC6-07B2-4B57-B9CC-2A3FFA4DFD33](http://ww4.sinaimg.cn/large/006tNc79gy1g5vsf7vdshj310u0b0tbz.jpg) 這裡需要注意`>>`和`>>>`存在一定的區別: `>>` :該數對應的二進位制碼整體右移,左邊的用**原有標誌位**補充,右邊超出的部分捨棄。 `>>>` :不管正負標誌位為0還是1,將該數的二進位制碼整體右移,左邊部分總是以0填充,右邊部分捨棄。 其餘操作部分與`<<`類似,就不再畫圖演示 #### 位運算子的運用場景 - 計算 $m * 2^n$ 次方 ```java 2 << 3 = 16; 2 * (2 * 2 * 2) = 16; ``` - 判斷一個數n的奇偶性 ```java a & 1 = 0; // 偶數 a & 1 = 1; // 奇數 ``` - 不用臨時變數交換兩個數 ```java a = a^b; b = b^a; a = a^b; ``` - x 的 相反數 表示為 (~x+1) ```java -x = (~x+1) ``` - 取絕對值 (a^(a>
>31))-(a>>31) 其餘的一些在演算法中用到的場景,我這裡就不再多少,有興趣的同學可以去研究一下~ ### 運算子優先順序 最高優先順序的在該表上方,最低優先順序的在該表底部 | 類別 | 操作符 | 關聯性 | | :------- | :---------------- | :------- | | 字尾 | ()[].(點操作符) | 左到右 | | 一元 | ++ - !~ | 右到左 | | 乘性 | * / % | 左到右 | | 加性 | + - | 左到右 | | 移位 | \>
\> \>\>\> << | 左到右 | | 關係 | \> \>= = < <= | 左到右 | | 相等 | == ~= | 左到右 | | 按位與 | & | 左到右 | | 按位異或 | ^ | 左到右 | | 按位或 | \| | 左到右 | | 邏輯與 | && | 左到右 | | 邏輯或 | \|\| | 左到右 | | 條件 | ?: | 從右到左 | | 賦值 | =,+=,-=,等等 | 從右到左 | | 逗號 | , | 左到右 | ### 公眾號 動動小手點點關注,就是對創作者最大的支援和贊同 ![](http://viyoungblog.oss-cn-beijing.aliyuncs.com/viyoung/2020-03-15-qrcode_for_gh_a65beceb0947_