首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 基礎進階:運算符優先級、類型轉換、溢出陷阱與最佳實踐

     編輯:Java 綜合教學

算術運算符詳解

運算符描述用法示例
*乘法expr1 * expr22 * 3 → 6
/除法expr1 / expr21 / 2 → 0 (整數除法截斷)
%取餘expr1 % expr25 % 2 → 1; -5 % 2 → -1
+加法/正號expr1 + expr21 + 2 → 3
-減法/負號expr1 - expr21 - 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 ≡ ((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

二元/一元運算類型提升總表

條件結果類型
任一為 doubledouble
任一為 floatfloat
任一為 longlong
其餘int

一元運算:double/float/long/int 不變;byte/short/char → int。

取餘與指數運算

  • 取餘本質:反覆減法直到絕對值小於除數。-5 % 2 → -1;5.5 % 2.2 → 1.1。
  • Java 無指數運算符,^ 是異或。使用 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 + 5x += 5;
-=x = x - 5x -= 5;
*=x = x * 5x *= 5;
/=x = x / 5x /= 5;
%=x = x % 5x %= 5;

前綴 vs 後綴

形式操作順序表達式值
++x / --x先增/減,後取值新值
x++ / x--先取值,後增/減舊值
int x = 5;
y = ++x; // x=6, y=6
y = x++; // x=6, y=5

關系與邏輯運算符

比較運算符 (返回 boolean)

運算符含義示例 (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 (&& 短路)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved