首先把 Java操作符的優先順序和結合性 貼在這,
Java操作符的優先順序和結合性
|
優先順序 |
結合性 |
1 |
[ ] . ( ) (函數呼叫) |
從左至右 |
2 |
! ~ ++ -- +(單運算元) –(單運算元) ( ) (類型轉化) new |
從右至左 |
3 |
* / % |
從左至右 |
4 |
+ - |
從左至右 |
5 |
<< >> >>> |
從左至右 |
6 |
< <= > >= instanceof |
從左至右 |
7 |
== != |
從左至右 |
8 |
& |
從左至右 |
9 |
^ |
從左至右 |
10 |
| |
從左至右 |
11 |
&& |
從左至右 |
12 |
|| |
從左至右 |
13 |
? : |
從右至左 |
14 |
= += -= *= /= %= ^= <<= >>= >>>= |
從右至左 |
然後看下邊題目:
int aa = 8,b = 4;</p><p>int expr = aa++%++b*2;
可以得出很多種答案的,那時候我一連做了幾次都沒有得出最終的正確答案,你可以試試看
然後,我們解析一下,要知道的 ++優先順序是2 右結合, * / %是一個層級上的, 優先順序是3 左結合的, 還要知道 ++(後自增)是先運算後增加的,前自增是先增加後運算的,好的,那麼我們的答案就應該是6, 首先 計算a++ 此時a的值仍為8,然後計算 ++b 此時b的值為5,再計算 8%5 結果3,最後3*2=6,下邊再引用a的話 a的值就為9了,因為運算完了要增加的嘛, b的值為5,
int expr = 4 << 2 + 1;
這個題目容易,知道 + 的優先順序比 <<的優先順序高(呵呵 有點不可思議吧 但是事實如此),就知道答案 32。
接下來的這個:
int a = 255;<br />int expr = (byte)a + (((byte)a) & 0xff);
在這裡要 說明一個int轉byte的小規律:
int a----->byte b (b = (byte)a);
a為正數:b = a - 256 ,如果b > 127 繼續b = b - 256,直至 範圍落在 -128 --127,
a為負數:b = a + 256 ,如果b < -128 繼續b = b + 256,直至 範圍落在 -128 -- 127。
還要知道 byte short char 作為運算元參與運算時候 系統都會先把他們轉成int數值來參與運算。
(byte)255 為 -1, -1 轉為int 1111 1111 1111 1111 ,和 0xff(0000 0000 1111 1111)相與,結果 -1 + 256 = 255。