繼續討論資料型別以前,先來談談所謂運算子。
運算子可以細分很多功能,大方向是用來表示資料的運算、賦值跟比較:
算術運算子
執行一般的數學運算,可以加 +
、減 -
、乘 *
、除 /
、取餘數 %
,也能進行遞增、遞減的運算;也能進行字串的相加。
int a = 10;
int b = 5;
System.out.println(1+2); // 3
System.out.println(a-b); // 5
System.out.println(a*b); // 50
System.out.println(a/3); // 3: 整數/整數=整數
System.out.println(a%3); // 1
System.out.println(b%-2); // 1
System.out.println(a++); // 11: 先運算後取值
System.out.println(b--); // 4
System.out.println(++a); // 11: 先取值後運算
System.out.println(--b); // 4
System.out.println("字串相加"+"的範例"); // 字串相加的範例
System.out.println("a = " + 10); // a = 10
System.out.println("10" + 10); // 1010
一般基本的運算在這都能完成,但進行小數點後多位數的精確財務運算,用浮點數容易出現誤差。
浮點數用 IEEE-754 規範指數和尾數,跟整數用位數表示的方法不同,這種規範不能精確表示十進制,所以會出現誤差。
因應這種情況,可以使用 BigDecimal 解決(一種類別)
BigDecimal num1 = new BigDecimal("34.56789876");
BigDecimal num2 = new BigDecimal("34.2234");
BigDecimal num3 = num1.add(num2);
number3 ==> 68.79129876
// 需注意:一旦創建 BigDecimal 對象,就不能改它的值
指定運算子
就是 =
,會把右邊的結果指定給左邊的變數,此外也能搭配算術運算子一起用。
需留意的是,當等號兩邊資料型別不一致時,會自動或強制轉換資料型別(下篇提到)。
變數名稱 = [運算式|變數|常值]
int i = 7;
int j;
float k = 3.0f;
i = 70;
i += 7;
System.out.println("i = " + i); // i = 77
比較運算子
比較運算子 | 說明 | 寫法 |
---|---|---|
== | 等於 | a == b |
!= | 不等於 | a != b |
< | 小於 | a < b |
> | 大於 | a > b |
<= | 小於等於 | a <= b |
>= | 大於等於 | a >= b |
instanceof | 是否為類別的對象 | "word" instanceof String |
比較運算子的結果都是 boolean。
邏輯運算子
邏輯運算子 | 說明 | 寫法 | a(T), b(T) | a(T), b(F) | a(F), b(T) | a(F), b(F) |
---|---|---|---|---|---|---|
& | 且 | a & b | true | false | false | false |
&& | 且 | a && b | true | false | false | false |
| | 或 | a | b | true | true | true | false |
|| | 或 | a || b | true | true | true | false |
! | 反向 | !a | false | false | true | true |
^ | 互斥 | a ^ b | false | true | true | false |
「&
與 &&
」跟「|
與 ||
」執行結果一樣,差別在&&
、||
加快執行效率,所以&&
、||
被歸類在邏輯運算中的特殊情況,被稱為短路運算子。
條件運算子 (三元運算子)
前面提到的分別屬於一元、二元運算子:
一元運算子:-10、i++
二元運算子:a + b
三元運算子則是用在條件式
(條件表達式) ? 表達式1 : 表達式2
例子
(a>b) ? a : b;
// 判斷式成立返回 a,不成立返回 b
三元運算子可以簡化 if else 語法,但回傳的表達式1 跟表達式2要是同種類型,而且一定要回傳一個結果
位元運算子
(相對於前面運算子較不常用)
直接對整數類別進行的二進制運算
運算方式(3 << 2 為例):
3 的二進位表示: 00000011
向左移動兩位後: 00001100
相關位元運算子
運算子 | 運算 | 例子 |
---|---|---|
<< | 左移 | 3 << 2 = 12 |
>> | 右移 | 3 >> 1 = 1 |
>>> | 無符號右移[1] | 3 >>> 1 = 1 |
& | AND[2] | 6 & 3 = 2 |
| | OR[3] | 6 & 3 = 2 |
^ | XOR[4] | 6 & 3 = 2 |
~ | AND[5] | 6 & 3 = 2 |
[1] 是一個零填充右移運算符。這意味著它將二進制數字向右移動指定的位數,並在左側用零填充空出的位
[2] AND: 如果兩個對應的位都是 1,則結果位為 1,否則結果位為 0
位為 0
6 的二進制表示: 0110
3 的二進制表示: 0011
位元 AND 運算結果:0010
[3] OR: 如果兩個對應的位相異(一個是 0,另一個是 1),則結果位為 1;如果兩個對應的位相同(都是 0 或都是 1),則結果位為 0
6 的二進制表示: 0110
3 的二進制表示: 0011
位元 OR 運算結果:0111
[4] XOR: 如果兩個對應的位中至少有一個是 1,則結果位為 1,否則結果為 0
6 的二進制表示: 0110
3 的二進制表示: 0011
位元 XOR 運算結果:0101
[5] NOT: 也稱為按位取反。它將操作數的每一位進行取反操作,即將每個位的 0 變為 1,每個位的 1 變為 0
6 的二進制表示: 00000000000000000000000000000110
按位取反結果: 11111111111111111111111111111001
// 對於二進制表示的數字 11111111111111111111111111111001,對應的有號整數值為 -7