首先把 Java操作符的优先级和结合性 贴在这,
|
优先级 |
结合性 |
1 |
[ ] . ( ) (函数呼叫) |
从左到右 |
2 |
! ~ ++ -- +(单操作数) –(单操作数) ( ) (类型转化) new |
从右到左 |
3 |
* / % |
从左到右 |
4 |
+ - |
从左到右 |
5 |
<< >> >>> |
从左到右 |
6 |
< <= > >= instanceof |
从左到右 |
7 |
== != |
从左到右 |
8 |
& |
从左到右 |
9 |
^ |
从左到右 |
10 |
| |
从左到右 |
11 |
&& |
从左到右 |
12 |
|| |
从左到右 |
13 |
? : |
从右到左 |
14 |
= += -= *= /= %= ^= <<= >>= >>>= |
从右到左 |
然后看下边题目:
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,
这个题目容易,知道 + 的优先级比 <<的优先级高(呵呵 有点不可思议吧 但是事实如此),就知道答案 32。
接下来的这个:
在这里要 说明一个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。