| 運算符 | 描述 | 用法 | 示例 |
|---|---|---|---|
| * | 乘法 | expr1 * expr2 | 2 * 3 → 6 |
| / | 除法 | expr1 / expr2 | 1 / 2 → 0 (整數除法截斷) |
| % | 取餘 | expr1 % expr2 | 5 % 2 → 1; -5 % 2 → -1 |
| + | 加法/正號 | expr1 + expr2 | 1 + 2 → 3 |
| - | 減法/負號 | expr1 - expr2 | 1 - 2 → -1 |
數學公式 (1+2*a)/3 + (4*(b+c)*(5-d-e))/f - 6*(7/g+h) 轉為代碼時不可省略乘號 *。
() 最高,可調整順序。+ - 次之。* / % 優於 加減 + -。1+2-3+4 ≡ ((1+2)-3)+4。僅支援 byte, short, int, long, float, double, char,不含 boolean。
int/long/float/double → 按該類型計算。1/2 → 0 而非 0.5。byte/short/char 運算先提升為 int:byte 127 + byte 1 → int 128。int/double → double/double → double。9 / 5 * 20.1
→ (9 / 5) * 20.1 // 整數除法先算
→ 1 * 20.1 // 9/5=1
→ 1.0 * 20.1 // 提升為 double
→ 20.1 // 結果 20.1 而非 36.18!
byte b1 = 1;
byte b2 = -b1; // 編譯錯誤:-b1 提升為 int,無法賦值給 byte
| 條件 | 結果類型 |
|---|---|
| 任一為 double | double |
| 任一為 float | float |
| 任一為 long | long |
| 其餘 | int |
一元運算:double/float/long/int 不變;byte/short/char → int。
-5 % 2 → -1;5.5 % 2.2 → 1.1。^ 是異或。使用 Math.pow(x, y)。int i1 = 2147483647; // Integer.MAX_VALUE
System.out.println(i1 + 1); // -2147483648 (向上溢出)
System.out.println(i1 * i1); // 1
int i2 = -2147483648; // Integer.MIN_VALUE
System.out.println(i2 - 1); // 2147483647 (向下溢出)
System.out.println(i2 * i2); // 0
關鍵點: Java 不拋出異常、不發警告,直接產生錯誤結果。程序員必須自行檢查。整數除法截斷屬於「向下溢出」。歷史原因:早期 CPU 檢查溢出性能開銷大。
double d = 3.5;
int i = (int) d; // i = 3,截斷小數部分
// 錯誤示範
int sum = 55.66f; // 編譯錯誤
// 正確
int sum = (int) 55.66f; // 55
int i = 3;
double d = i; // 正確,d = 3.0
double d2 = (double) i; // 顯式也可
double a = 55; // 編譯器自動轉 55.0
byte → short → int → long → float → double (char 視為 16 位無符號整數 0~65535)。boolean 不參與轉換。
int sum = 5050; // 1+...+100
double avg = sum / 100; // 50.0 錯誤!整數除法
double avg = (double)sum / 100; // 50.5 正確
double avg = sum / 100.0; // 50.5 正確
double avg = (double)(sum / 100); // 50.0 錯誤!先算再轉
| 運算符 | 等價形式 | 示例 |
|---|---|---|
| += | x = x + 5 | x += 5; |
| -= | x = x - 5 | x -= 5; |
| *= | x = x * 5 | x *= 5; |
| /= | x = x / 5 | x /= 5; |
| %= | x = x % 5 | x %= 5; |
| 形式 | 操作順序 | 表達式值 |
|---|---|---|
| ++x / --x | 先增/減,後取值 | 新值 |
| x++ / x-- | 先取值,後增/減 | 舊值 |
int x = 5;
y = ++x; // x=6, y=6
y = x++; // x=6, y=5
| 運算符 | 含義 | 示例 (x=5,y=8) |
|---|---|---|
| == | 相等 | false |
| != | 不等 | true |
| > | 大於 | false |
| >= | 大於等於 | true |
| < | 小於 | false |
| <= | 小於等於 | true |
正確鏈式判斷:(x >= 0) && (x <= 100);錯誤:0 < x < 100。
| 運算符 | 名稱 | 短路特性 |
|---|---|---|
| ! | 邏輯非 | - |
| ^ | 異或 | 否 |
| && | 邏輯與 | 左側 false 則右側不執行 |
| || | 邏輯或 | 左側 true 則右側不執行 |
與(&&): T&T=T, T&F=F, F&T=F, F&F=F
或(||): T|T=T, T|F=T, F|T=T, F|F=F
非(!): !T=F, !F=T
異或(^): T^T=F, T^F=T, F^T=T, F^F=F
// 範圍判斷
(x >= 0) && (x <= 100)
// 閏年判斷
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
System.out.println(true || true && false); // true (|| 短路)
System.out.println(false && true ^ true); // false (&& 短路)