Java 學習筆記 03 – 運算子


Posted by vickyh1315 on 2024-04-02

繼續討論資料型別以前,先來談談所謂運算子。
運算子可以細分很多功能,大方向是用來表示資料的運算、賦值跟比較:

算術運算子

執行一般的數學運算,可以加 +、減 -、乘 *、除 /、取餘數 %,也能進行遞增、遞減的運算;也能進行字串的相加。

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

#java







Related Posts

[Program] 三分鐘連猴子都能理解的遞迴核心

[Program] 三分鐘連猴子都能理解的遞迴核心

Java 學習筆記 04 – 資料型別轉換

Java 學習筆記 04 – 資料型別轉換

	JS-[forEach篇]-遍歷陣列:for of 與 .forEach()

JS-[forEach篇]-遍歷陣列:for of 與 .forEach()


Comments