Java提供非常多種運算子,但運算子(operators)到底是什麼?它可以對一個、兩個或是三個運算元進行運算動作,執行運算元會將值回傳,至於回傳值的型態則是根據運算元不同而有差異。
算術運算子也被稱為二元運算子,其實就是算數學時也常看到的符號。
int a = 2; int b = 1;
System.out.print(a+b); // 相加, 3
System.out.print(a-b); // 相減, 1
System.out.print(a*b); // 相乘, 2
System.out.print(a/b); // 相除, 2
System.out.print(a%b); // 取a除以b後的餘數, 0
如果兩個運算元的型態不相等,運算後回傳值的型態會跟運算元位階高的相同,像是5.0/2=2.5
,但如果兩個運算元都是基本型別,至少會轉換成int。
這個運算子只有兩種++和--,但有四種不同情況,它們分為後置型和前置型。後置型就是放在變數後面,像是a++,它是先取值之後再遞增;前置型(++a)則是先遞增後再取值。
int a = 5; int b = 5;
System.out.print(a++); // 5
System.out.print(a); // 6
System.out.print(++b); // 6
System.out.print(b); // 6
指定運算子是將右邊運算的結果指定給左邊的變數保存起來,很特別的是程式中的=
並不是數學上等於的意思,而是指定,也因此右邊的值的位階是不能高過左邊的位階。
剛剛算術運算子的地方也有提到位階,這邊講一下位階的高低順序:double>float>long>int>short>byte。
int a = 5;
System.out.print(a=3); // 3, a=3
System.out.print(a+=2); // 5, a=a+2
System.out.print(a-=2); // 3, a=a-2
System.out.print(a*=3); // 9, a=a*3
System.out.print(a/=3); // 3, a=a/3
System.out.print(a%=2); // 1, a=a%2
關係運算子其實非常的簡單,就是用來比大小的,它的回傳值結果會是布林值,也就是true或false。
int a = 2; int b = 1;
System.out.print(a<b); // false, a是否小於b
System.out.print(a<=b); // false, a是否小於等於b
System.out.print(a==b); // false, a是否等於b
System.out.print(a>=b); // true, a是否大於等於b
System.out.print(a>b); // true, a是否大於b
條件運算子是將兩個布林值合併起來的運算子,它的運算結果和關係運算子一樣都是布林值(true或false)。
其實這種運算子有六種
a && b
,當a和b都是true時回傳true,邏輯上就像是and(捷徑)a || b
,a和b只要有一個是true就會回傳true,邏輯上就像是or(捷徑)! a
,會傳回相反的布林值,邏輯上就像是nota & b
,當a和b都是true時回傳true,邏輯上就像是and(一般)a || b
,a和b只要有一個是true就會回傳true,邏輯上就像是or(一般)a ^ b
,當a和b一個是true一個是false時才會回傳true,邏輯上就像是xor我們都知道資料在電腦中都是以0和1的方式儲存,所謂的位元運算其實就是逐位元進行比較。
條件運算子中&、|、^還有第二種身份,那就是位元運算子,它們可以用在整數的位元運算。除了這三種還有一個~,它會將位元1變成0,0變成1。
// & (and)
int a = 15; // 00000000000000000000000000001111
int b = 30; // 00000000000000000000000000011110
System.out.print(a&b); // 14, 00000000000000000000000000001110
// | (or)
a = 15; // 00000000000000000000000000001111
b = 30; // 00000000000000000000000000011110
System.out.print(a|b); // 31, 00000000000000000000000000011111
// ^ (xor)
a = 15; // 00000000000000000000000000001111
b = 30; // 00000000000000000000000000011110
System.out.print(a^b); // 17, 00000000000000000000000000010001
// ~ (位元翻轉)
a = 15; // 00000000000000000000000000001111
System.out.print(~a); // -16, 11111111111111111111111111110000
移位運算子是用在整數int或是long型態的,它目的是向左或向右移動目標運算元的每個位元。>>和>>>的差異是後者不會管當前的符號位元,直接右移補0。若右邊參數超過本身型態的位元數會以餘數作為移位的次數。
int a = 8; // 00000000000000000000000000001000
int b = 2;
System.out.println(a>>b); // 2, 00000000000000000000000000000010, 將a向右移動b位元
System.out.println(a<<b); // 32, 00000000000000000000000000100000, 將a向左移動b位元
System.out.println(a>>>b); // 2, 00000000000000000000000000000010, 將a向右移動b位元
終於到最後一個了。三元運算子其實就是一個簡略的if-else敘述。它的用法是a?b:c
,也就是如果條件a為true就執行運算式b,如果條件a為false就執行運算式c。如果你平常有在用excel會發現它們是差不多的。
呼終於打完了好多好多字,希望大家都可以看得懂~