类别 | Java 运算符 |
---|---|
算数运算符 | + - * / % ++ – |
扩展赋值运算符 | += -= *= /= %= |
比较运算符 | > < >= <= == != |
逻辑运算符 | &&、丨丨、! |
位运算符 | & 丨 ^ ~ >> << >>> |
赋值运算符 | = |
算数运算符
在 Java 中,使用算数运算符 + 、- 、* 、/ 表示加、减、乘、除运算。当参与 / 运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用 % 表示。
整数被 0 除将会产生一个异常,而浮点数被 0 除将会得到无穷大或 NaN 结果。
可以在赋值语句中采用一种简化的格式书写二元算术运算符:
a += 2;
b -= 2;
c *= 2;
d /= 2;
e %= 2;
该写法等同于:
a = a + 4;
b = b - 2;
c = c * 2;
d = d / 2;
e = e % 2;
### 自增运算符与自减运算符 加 1 、减 1 是数值变量最常见的操作,所以 Java 使用了两种自增、两种自减运算符: **++n 和 n++ 将变量 n 的当前值加 1;** **--n 和 n-- 将变量 n 的当前值减 1;**
前缀与后缀区别:
int m = 7;
int n = 7;
int a = 2 * ++m;//现在 a 是 16 ,m 是 8
int b = 2 * n++;//现在 b 是 14 ,n 是 8
- 因为这些运算符改变了变量的值,所以它的操作数不能使数值,例如,2++ 就是一条非法的语句。
- 建议不要在其他表达式的内部使用 ++ 或 –,这样编写的代码很容易令人困惑,并会产生烦人的 bug 。
## 关系运算符与 boolean 运算符 **关系运算符:** >`==` 检测左右两边是否相等 `!=` 检测左右两边是否不相等 `<` 检测左边是否小于右边 `>` 检测左边是否大于右边 `<=` 检测左边是否小于或等于右边 `>=` 检测左边是否大于或等于右边
boolean 运算符:
&& 逻辑“与”
|| 逻辑“或”
! 逻辑“非”
&& 和 || 是按照“短路”方式求值的。如果第一个操作数已经能够确定表达式的值,则第二个操作数就不必计算了:
if (x != 0 && 1 / x > x + y) //当 x 为 0 时,不会计算第二部分。因此也不会出现除以 0 的错误。
## 位运算符 **位运算符可以直接对组成整型数值的各个位进行操作。**位运算符包括:&, |, ^, ~, >>, << 和 >>>。 ### & 运算符 按位“与”运算:二进制位都为 1 则为 1 ,例:
int a = 0b1010 & 0b1100;//结果为 0b1000 ,也就是 a = 8
| 运算符
按位“或”运算:二进制位有一个为 1 则为 1 ,例:
int a = 0b1010 & 0b1100;//结果为 0b1110 ,也就是 a = 14
^ 运算符
按位“异或”运算:二进制位不同为 1 ,相同为 0 ,例:
int a = 0b1010 & 0b1100;//结果为 0b0110 ,也就是 a = 6
~ 运算符
按位“非”运算:二进制位取反,1 变 0 ,0 变 1 ,例:
int a = ~10;//10 的二进制是 0b1010, 结果为 0b0101 ,也就是 a = 5
>> 运算符
“右移”运算:将二进制位进行右移运算,用符号位填充高位:
int a = 2;//0b0010
int b = a >> 1;//将 a 右移 1 位,b = 0b0001 ,也就是 b = 1
<< 运算符
“左移”将二进制位进行左移运算,用 0 填充低位:
int a = 2;//0b0010
int b = a << 2;//将 a 左移 2 位,b = 0b1000 ,也就是 b = 8
>>> 运算符
无符号“右移” 将二进制位进行右移运算,用 0 填充高位:
int a = -8;//0b1000
int b = a >>> 1;//将 a 无符号右移 1 位,b = 0b0100 ,也就是 b = 4
这些运算符在位模式下工作,意味着可以使用屏蔽技术获得整数中的各个位,例如:
int n = x;//假设 n 是一个整型变量
int fourthBitFromRight = (n & 0b1000) / 0b1000;
//如果用二进制表示的 n 从右数第四位为 1 ,则返回 1 ,否则返回 0 。
//也可以用移位运算实现:
fourthBitFromRight = (n & (1 << 3)) >> 3;
按位运算都是补码运算的:
int a = 19;//0001 0011
System.out.println(~a);//按位取反为 11101100,此时仍为补码,换算原码为 10010100,也就是-20
## 附:运算符优先级