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

Java 運算子與指派完整解析(上)

     編輯:Java 相關知識

考試目標

判斷任意運算子(含指派運算子與 instanceof)作用於任意型別、類別範圍、存取權限運算元時的結果。

1. 一元運算子

1.1 遞增/遞減 ++ --

  • 後綴(x++):取值後修改。x=5; y=x++; → x=6, y=5
  • 前綴(++x):修改後取值。x=5; y=++x; → x=6, y=6
  • 用於 byte、short、char 時會隱性縮小轉換。

1.2 正負號 + -

  • + 無實際作用,僅強調正數。
  • - 取相反數(整數採二補數)。

1.3 邏輯非 !

反轉布林運算式的值。

1.4 位元補數 ~

反轉整數運算式的位元模式(一補數,0↔1)。公式:~i = -i - 1。不可用於非整數型別。

1.5 強制轉型 (type)

說服編譯器允許特定指派。編譯期與執行期皆做嚴格型別安全檢查。

2. 算術運算子 * / % + -

  • 適用於所有數值型別。
  • + 亦可用於字串串接。
  • 運算至少以 int 精度進行(小型別會提升)。結果型別至少與較寬運算元同寬。
  • 整數溢位靜默發生,結果為無意義值。
  • 整數除以 0 或取模 0 拋出 ArithmeticException。
  • 浮點運算必失精度。1.0f/3.0f * 3.0f == 1.0f 為 false。
  • % 結果正負號完全由左運算元決定。
  • 浮點運算可產生 NaN、Infinity、-Infinity。Float/Double 提供具名常數。
  • NaN 不可用 == 比較,需用 Float.isNaN() / Double.isNaN()。但 equals() 可正確比較包裝物件的 NaN。
  • Infinity 可用 == 比較。
  • + 串接字串時會呼叫非字串運算元的 toString();基本型別會自動裝箱。
  • 注意結合性:1 + 2 + "3" → "33";"1" + 2 + 3 → "123"。

3. 位移運算子 << >> >>>

  • <<:有號左移,右側補 0,符號位保留。值變為 old * 2^x。
  • >>:有號右移,左側補符號位(正補 0、負補 1)。值變為 old / 2^x。又稱算術右移。
  • >>>:無號邏輯右移,左側補 0。負數會變正數。不可用於比 int 窄的型別(因先提升為 int 再截斷,結果不可預期)。
  • 僅適用於整數型別。
  • -1 >> 1 = -1(非 0)。
  • 1 << 31 為 int 最小值。
  • 負數採二補數表示。
  • 位移量模運算:int 取低 5 位(模 32),long 取低 6 位(模 64)。

4. 比較運算子(回傳 boolean)

4.1 序數比較 < <= > >=

僅用於數值型別。char 可與 float 比較。

4.2 型別比較 instanceof

  • 執行期檢查物件類別。編譯期與執行期皆檢查(同強制轉型)。
  • 左運算元為物件參考、變數或陣列參考。
  • 右運算元為類別(含抽象類)、介面或陣列型別。編譯期若無關係則報錯。
  • 不可用 java.lang.Class 或字串名稱作右運算元。
  • 回傳 true 條件:左為右的類別/子類別、左實作右介面、左為右型別的陣列。
  • null instanceof X 為 false,不拋例外。
  • 若 x instanceof Y 編譯不通過,則 (Y)x 為無效轉型;若編譯通過但回傳 false,轉型合法但執行期拋 ClassCastException;若回傳 true,轉型合法且執行正常。

4.3 相等比較 == !=

  • 基本型別:值比較(含提升)。
  • 物件參考:比較參考位址。有意義比較請用 equals()(確保類別正確覆寫)。
  • 字串字面常數:因編譯器優化,== 回傳 true。

5. 位元運算子 & ^ |

  • 作用於數值與布林運算元。
  • &:AND,皆為 1 才為 1。
  • |:OR,任一為 1 即為 1。
  • ^:XOR,恰好一個為 1 才為 1。
  • 布林視為 1/0。優先序:AND → XOR → OR。
  • 不可將其他型別轉為 boolean。

6. 短路邏輯運算子 && ||

  • 僅作用於布林型別。
  • 若左運算元已決定結果,右運算元不評估(短路)。
  • false && X 永遠 false;true || X 永遠 true。

7. 三元運算子 ? :

a = x ? b : c;
  • x 必為布林運算式。
  • 根據 x 僅評估 b 或 c,不會兩者皆評估。
  • b、c 需與 a 指派相容,並依提升規則統一型別。

8. 指派運算子

  • 簡單指派 =。
  • 複合指派 *= /= %= += -= 等。x += y 等同 x = x + y 但 x 僅評估一次。
  • 參考型別指派複製參考值,非物件本體。
  • 指派運算式有值(指派後左運算元的值),故 a = b = c = 0 合法。
  • 複合指派含隱性轉型(對 byte/short/char 有用)。
    例:byte b=10; b+=10; 合法;b=b+10; 需顯性轉型。

9. 一般規則

  • Java 整數無溢位/下溢,採環繞模式(Integer.MAX_VALUE + 1 = Integer.MIN_VALUE)。
  • 運算元由左至右評估,運算依優先序與結合性執行。
  • 後綴一元與所有二元(除指派)左結合。
  • 其他一元、指派、三元、物件建立、轉型右結合。

優先序與結合性總表

類別運算子結合性
後綴[] . (params) ++ --左→右
前綴一元++ -- + - ~ !右→左
物件建立/轉型new (type)右→左
乘除模* / %左→右
加減+ -左→右
位移>> >>> <<左→右
關係< <= > >= instanceof左→右
相等== !=左→右
位元/布林 AND&左→右
位元/布林 XOR^左→右
位元/布林 OR|左→右
邏輯 AND (短路)&&左→右
邏輯 OR (短路)||左→右
三元? :右→左
指派= += -= *= /= %= <<= >>= >>>= &= ^= |=右→左

經典陷阱範例

public class Precedence {
    public static void main(String[] args) {
        int i = 0;
        i = i++; // i = 0
        i = i++; // i = 0
        i = i++; // i = 0
        System.out.println(i); // 印 0,因 = 優先序最低

        int[] array = new int[5];
        int index = 0;
        array[index] = index = 3; // 第 0 元素被指派 3,非第 3 元素
        for (int c = 0; c < array.length; c++)
            System.out.println(array[c]);
        System.out.println("index is " + index); // 印 3
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved