判斷任意運算子(含指派運算子與 instanceof)作用於任意型別、類別範圍、存取權限運算元時的結果。
++ --x++):取值後修改。x=5; y=x++; → x=6, y=5++x):修改後取值。x=5; y=++x; → x=6, y=6byte、short、char 時會隱性縮小轉換。+ -+ 無實際作用,僅強調正數。- 取相反數(整數採二補數)。!反轉布林運算式的值。
~反轉整數運算式的位元模式(一補數,0↔1)。公式:~i = -i - 1。不可用於非整數型別。
(type)說服編譯器允許特定指派。編譯期與執行期皆做嚴格型別安全檢查。
* / % + -+ 亦可用於字串串接。int 精度進行(小型別會提升)。結果型別至少與較寬運算元同寬。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"。<< >> >>><<:有號左移,右側補 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)。< <= > >=僅用於數值型別。char 可與 float 比較。
instanceofjava.lang.Class 或字串名稱作右運算元。true 條件:左為右的類別/子類別、左實作右介面、左為右型別的陣列。null instanceof X 為 false,不拋例外。x instanceof Y 編譯不通過,則 (Y)x 為無效轉型;若編譯通過但回傳 false,轉型合法但執行期拋 ClassCastException;若回傳 true,轉型合法且執行正常。== !=equals()(確保類別正確覆寫)。== 回傳 true。& ^ |&:AND,皆為 1 才為 1。|:OR,任一為 1 即為 1。^:XOR,恰好一個為 1 才為 1。&& ||false && X 永遠 false;true || X 永遠 true。? :a = x ? b : c;
x 必為布林運算式。x 僅評估 b 或 c,不會兩者皆評估。b、c 需與 a 指派相容,並依提升規則統一型別。=。*= /= %= += -= 等。x += y 等同 x = x + y 但 x 僅評估一次。a = b = c = 0 合法。byte/short/char 有用)。byte b=10; b+=10; 合法;b=b+10; 需顯性轉型。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
}
}