Java中的運算符大致分為:算術運算符、賦值運算符、關系運算符、邏輯運算符和位運算符五類。
(1)、算術運算符:+ - * / % ++ --
(2)、賦值運算符:= += -= *= /= %=
(3)、關系運算符:== != > >= < <=
(4)、邏輯運算符:& | ! ^ && ||
(5)、位運算符:& | ~ ^ << >> >>>
一、算術運算符
按照操作數數目分為單目運算符(一元運算符)和雙目運算符(二元運算符)。
1、單目運算符,只有一個操作數。
單目運算符有: + (正) - (負) ++ (自增) -- (自減)。
++ (自增) 和-- (自減)放在操作數前面,稱為前自增(自減),要先對被操作數作自增1或自減1運算,再進行其它的運算操作。
反之,++ (自增) 和-- (自減)放在操作數后面,稱為后自增(自減),要先進行其它運算,再進行自增1或自減1運算。
- public class Demo {
- public static void main(String[] args) {
- int a = 5;
- int x, y;
- x = +a;// 正值
- System.out.println("x=" + x);// 打印結果:x=5
- y = -a;// 負值
- System.out.println("y=" + y);// 打印結果:y=-5
- // 前自增
- int i = 5;
- System.out.println("++i=" + (++i));// 打印結果:++i=6
- System.out.println("i=" + i);// 打印結果:i=6
- // 后自增
- i = 5;
- System.out.println("i++=" + (i++));// 打印結果:i++=5
- System.out.println("i=" + i);// 打印結果:i=6
- // 前自減
- int j = 12;
- System.out.println("--j=" + (--j));// 打印結果:--j=11
- System.out.println("j=" + j);// 打印結果:j=11
- // 后自減
- j = 12;
- System.out.println("j--=" + (j--));// 打印結果:j--=12
- System.out.println("j=" + j);// 打印結果:j=11
- }
- }
2、雙目運算符,有兩個操作數,運算符在操作數之間。
雙目運算符有: + (加) - (減) * (乘) / (除) % (求余或者取模)。
三點注意:
(1)、在java程序中的運算符不可以省略,在數學上y=2x,可以省略乘號,但java里必須寫y=2*x;
(2)、在進行除法運算時,當除數和被除數都是整數時,得到的結果也是一個整數(會忽略小數部分)。如果除法運算有小數參與,得到的結果會是一個小數.
(3)、在進行求余(%)運算時,運算結果的正負取決於被模數(%左邊的數)的符號,與模數(%右邊的數)的符號無關。如:-5%3=-2;而5%-3=2;
求余記住:任意正整數%2,結果要么是0,要么是1,用於切換條件。左邊如果小於右邊,結果是左邊。左邊如果等於右邊,結果是0。右邊是1,結果為0。
- public class Demo {
- public static void main(String[] args) {
- int x = 5, y = 12;
- System.out.println(x + "+" + y + "=" + (x + y));// 相加結果:5+12=17
- System.out.println(x + "-" + y + "=" + (x - y));// 相減結果:5-12=-7
- System.out.println(x + "*" + y + "=" + (x * y));// 相乘結果:5*12=60
- System.out.println(y + "/" + x + "=" + (y / x));// 相除結果:12/5=2
- // 求余
- System.out.println(5 % -3);// 模數為負數求余結果:2
- System.out.println(-5 % 3);// 被模數為負數求余結果:-2
- System.out.println(12 % 5);// 普通求余結果:2
- System.out.println(12 % 2);// 模數為2求余結果:0
- System.out.println(12 % 1);// 模數為1求余結果:0
- System.out.println(12 % 12);// 被模數與模數相等求余結果:0
- System.out.println(5 % 6);// 被模數小於模數求余結果:5
- }
- }
二、賦值運算符
賦值運算符的作用就是將常量、變量或表達式的值賦給某一個變量。
賦值運算符有:
= (賦值,注意與==區別) 把等式右邊的值賦給等式左邊的變量。
+= (加等)把等式左右兩邊的值相加之后的值賦給左邊的變量。
-= (減等) 把等式左右兩邊的值相減之后的值賦給左邊的變量。
*= (乘等) 把等式左右兩邊的值相乘之后的值賦給左邊的變量。
/= (除等) 把等式左右兩邊的值相除之后的值賦給左邊的變量。
%= (模等) 把等式左右兩邊的值求余之后的值賦給左邊的變量。
三點注意:
(1)、在java中可以通過一條賦值語句對多個變量進行賦值。示例:
int x,y,z;
x=y=z=5;//為三個變量同時賦值。
錯誤寫法:int x=y=z=5;
(2)、除了=,其它都是特殊的賦值運算符,以+=為例,x+=3就相當於x=x+3,首先會進行加法運算x+3,再將運算結果賦值給變量x。其它賦值運算符都可以此類推。
(3)、在使用+=、-=、*=、/=、%=運算符進行賦值時,強制類型轉換會自動完成,程序不需要做任何顯示的聲明。
三、關系運算符
關系運算符用於對兩個數值或變量進行比較,其結果是一個布爾值,即true或false。
關系運算符有:==(相等) !=(不等) >(大於) >= (大於等於) <(小於) <=(小於等於)
注意:不能將關系運算符==寫成賦值運算符=,二者是不同的運算符,運算結果是不同的。切記!
- public class Demo {
- public static void main(String[] args) {
- System.out.println(12 == 21);// 判斷是否相等,結果為:false
- System.out.println(5 != 6);// 判斷是否不相等,結果為:true
- System.out.println(4 > 3);// 判斷4是否大於3,結果為:true
- System.out.println(4 >= 4);// 判斷4是否大於等於4,結果為:true
- System.out.println(3 < 5);// 判斷3是否小於5,結果為:true
- System.out.println(6 <= 5);// 判斷6是否小於等於5,結果為:false
- }
- }
四、邏輯運算符
邏輯運算符用於對布爾型的數據進行操作,其結果仍是一個布爾型。
邏輯運算符有:
&(與):兩邊都為真結果為真,否則為假。
|(或) :兩邊只要有一個為真,結果為真,否則為假。
! (非) :非真則為假,非假則為真。
^ (異或) :兩邊相同則為假,兩邊不同則為真。
&&(短路與) :兩邊都為真結果為真,否則為假。
||(短路或):兩邊只要有一個為真,結果為真,否則為假。
特別注意:
&與&&的區別:&無論左側條件為真還是為假,都會計算判斷右側的條件。而&&當左側條件為假時,不會計算判斷右側的條件,當左側為真,才會繼續判斷右側的條件。因為與運算結果為真必須滿足左右兩邊條件都為真。
|與||的區別:|無論左側條件為真還是為假,都會計算判斷右側的條件。而||當左側條件為真時,不會計算判斷右側的條件,當左側為假時,才會繼續判斷右側的條件。因為或運算結果為真只要滿足一邊為真即可。
程序開發中建議使用&&(短路與) 和||(短路或),提高執行效率。
- public class Demo {
- public static void main(String[] args) {
- // !非 真變假,假變真
- System.out.println(!(12 > 21));// 結果為:true
- System.out.println(!true);// 結果為:false
- // ^異或 兩操作數一真一假,結果才為真,否則為假
- int x = 18;
- System.out.println(x >= 18 ^ x < 18);// 結果為:true
- System.out.println(x < 18 ^ x == 18);// 結果為:true
- System.out.println(x != 18 ^ x > 18);// 結果為:false
- System.out.println(x == 18 ^ x <= 18);// 結果為:false
- // 邏輯與&、短路與&& 兩操作數同真,結果為真,否則為假
- int y = 5;
- System.out.println(y > 5 & y <= 5);// 結果為:false
- System.out.println(y >= 5 && y < 5);// 結果為:false
- System.out.println(y != 5 & y < 5);// 結果為:false
- System.out.println(y == 5 && y <= 5);// 結果為:true
- // 邏輯或|、短路或|| 兩操作數同假,結果為假,否則為真
- int z = 2;
- System.out.println(z != 18 | z > 18);// 結果為:true
- System.out.println(z >= 18 || z == 18);// 結果為:false
- System.out.println(z <= 18 | z > 18);// 結果為:true
- System.out.println(z != 18 || z == 18);// 結果為:true
- // 短路與測試
- int i1 = 18;
- System.out.println(i1 != 18 && i1++ > 18);// 結果為:false
- System.out.println("i1:" + i1);// 由於左邊條件為false,所以右邊的表達式未作判斷,i1結果為:18
- int i2 = 18;
- System.out.println(i2 != 18 & i2++ > 18);// 結果為:false
- System.out.println("i2:" + i2);// 左邊條件為false,右邊依然需要判斷,i1結果為:19
- // 短路或測試
- int j1 = 18;
- System.out.println(j1 == 18 || j1++ > 18);// 結果為:true
- System.out.println("j1:" + j1);// 由於左邊條件為true,所以右邊不作判斷,j1結果為:18
- int j2 = 18;
- System.out.println(j2 == 18 | j2++ > 18);// 結果為:true
- System.out.println("j2:" + j2);// 左邊條件為true,右邊依然需要判斷,j2結果為:19
- }
- }
奉上邏輯運算符真值表:
五、位運算符
位運算符是針對二進制數的每一位進行運算的符號,它是專門針對數字0和1進行操作的。
位運算符有:&(按位與) |(按位或) ~(取反) ^(按位異或) <<(左移) >>(右移) >>>(無符號右移)
位運算操作的真值表與邏輯運算符的真值表完全相同。只是位運算的操作數和結果都是二進制整數。
(1)、按位與運算符“&”是將參與運算的兩個二進制數進行與運算,如果兩個二進制位都為1,則該位的運算結果為1,否則為0.
例如:將6和11進行與運算,6對應的二進制數是00000110,11對應的二進制數是00001011.具體演算過程如下:
00000110
& 00001011
00000010
運算結果為00000010,對應數值為2.
(2)、 按位或運算符“|”是將參與運算的兩個二進制數進行或運算,如果二進制位上有一個值為1,則該位的運行結果為1,否則為0.例如:將6與11進行或運算。
00000110
| 00001011
00001111
運算結果為00001111,對應的數值是15.
(3)、取反運算符“~”只針對一個操作數進行操作,如果二進制位是0,則取反值為1,如果是1,則取反值為0.
例如:將6進行取反運算。
~ 00000110
11111001
運算結果為11111001,對應的數值是-7
(4)、按位異或運算符“^”是將參與運算的兩個二進制數進行異或運算,如果二進制位相同,則值為0,否則為1.例如:將6和11進行異或運算。
00000110
^ 00001011
00001101
運算結果為00001101,對應數值是13.
一個數異或同一個數兩次,結果還是那個數。
(5)、左移運算符“<<”就是將操作數所有二進制位向左移動一位,運算時,右邊的空位補0,左邊移走的部分舍去。(一個整數向左移動幾位就乘以2的幾次冪),越移越大。
例如:將11左移動一位。
<<1 00001011
00010110
運算結果為00010110,對應數值是22.(亦或是11*2的1次方=22)
(6)、右移運算符“>>”就是將操作數所有二進制位向右移動一位。運算時,左邊的空位根據原數的符號補0或1(原來是負數就補1,是正數就補0)(一個整數向右移動幾位就除以2的幾次冪,高位時0就補0,是1就補1),越移越小。
例如:將11右移一位
>>1 00001011
00000101
運算結果為00000101,對應的數值是5.
(7)、無符號右移運算符“>>>”就是將操作數所有二進制位向右移動一位,左邊的空位補0(即不考慮原數的正負情況,最高位都用0補)
例如:將11無符號右移一位
>>>1 00001011
00000101
運算結果為00000101,對應的數值是5.
特殊的運算符:條件運算符(三目運算符)
格式為:<表達式1>?<表達式2>:<表達式3>
執行流程:先計算表達式1的值,當表達式1為true,則把表達式2的值作為整個表達式的結果;當表達式1為false,則將表達式3的值作為整個表達式的結果。
附運算符優先級表
優先級 | 運算符 | 結合性 |
1 | . [] () | 從左向右 |
2 | ++ -- ~ !(數據類型) | 從右向左 |
3 | */ % | 從左向右 |
4 | + - | 從左向右 |
5 | << >> >>> | 從左向右 |
6 | < ><= >= | 從左向右 |
7 | == != | 從左向右 |
8 | & | 從左向右 |
9 | ^ | 從左向右 |
10 | | | 從左向右 |
11 | && | 從左向右 |
12 | || | 從左向右 |
13 | ?: | 從右向左 |
14 | = *= /= %= += -= <<= >>= >>>= &= ^= /= | 從右向左 |