算术运算符
算术操作符不能对 boolean 类型使用,可以对 char 类型使用,因为 char 类型是 int 类型的子集。
除操作符对整数使用,结果为整数。
取模运算符对整数和浮点数使用,都返回余数。
在某些情况下,复合赋值操作符比它的等价形式更有效率。
位运算符
运算符 | 运算结果 |
---|---|
~ | 按位取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
>> | 右移 |
>>> | 零填充右移 |
<< | 左移 |
aboveEach= | 按位复合赋值操作,除了 ~ |
负数使用补码表示。如 -a 的二进制表示获取步骤为:首先获得正数 a 的二进制表示,然后逐位取反,最后加 1 得到 -a 的二进制表示。使用的原因是这种表示方式可以用一个二进制数表示 +0 和 -0。
左移
value << num
将 value 的二进制表示中最高的 num 位去除,然后在后面用 0 补上去除的位数。
当对 byte 和 short 类型进行左移操作时,类型提升成 int 然后左移,得到的结果可能和预期的不一样。
右移
value >> num
右移时,空缺的高位使用最高位(即符号位)的值进行填充。
无符号右移
value >>> num
右移时,空缺的最高位用 0 填充。当对 byte 和 short 类型进行右移操作时,类型会提升为 int。
关系运算符
C/C++ 中,非零值为 true,零值为 false;Java 中,不存在这种用法,其他类型的值不能转换成 boolean 类型,需要显式使用关系运算符比较。
Boolean 逻辑运算符
运算符 | 运算结果 |
---|---|
& | 与 |
| | 或 |
^ | 异或 |
|| | 短路法则或 |
&& | 短路法则与 |
! | 非 |
&=, |=, ^= | 复合赋值 |
赋值运算符
可以使用赋值链(chain of assignments)。
int x, y, z;
x = y = z = 1;
三元运算符
? :
返回的结果不能为 void。
运算符优先级
从高到低为:
最高 | ||||||
---|---|---|---|---|---|---|
++(后缀) | ++(后缀) | |||||
++(前缀) | ++(前缀) | ~ | ! | +(一元) | -(一元) | (typeCast) |
* | / | % | ||||
+ | - | |||||
>> | >>> | << | ||||
> | >= | < | <= | instanceof | ||
== | != | |||||
& | ||||||
^ | ||||||
| | ||||||
&& | ||||||
|| | ||||||
?: | ||||||
-> | ||||||
= | operator= | |||||
最低 |
添加括号不会使程序性能下降,对复杂的表达式添加括号易于阅读。
参考
[1] Herbert Schildt, Java The Complete Reference 11th, 2019.