Java运算符
运算符分类:
-
算数运算符
-
关系运算符
-
位运算符
-
逻辑运算符
-
赋值运算符
-
其他运算符
算数运算符
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 | 1+1=2 |
- | 减法 | 3-2=1 |
* | 乘法 | 2*3=6 |
/ | 整除,当两边为整数时,取整 | 3/2=1 3.0/2=1.5 |
% | 取余 | 7%5=2 |
++ | 自增,符号在前,先自增再输出,符号在后,先输出再自增 | a=3 System.out.println(a++); // 3 System.out.println(++a); // 5 |
-- | 自减,符号在前,先自减再输出,符号在后,先输出再自减 | a=3 System.out.println(a--); // 3 System.out.println(--a); // 1 |
关系运算符
操作符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | 1==1 true |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | 1!=1 false |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | 3>2 true |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | 3<2 false |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | 3>=2 true |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | 3<=3 true |
位运算符
在计算机中,有符号的数据的表示法通常分为 原码、反码和补码三种形式,所有的数据运算都是采用补码的是形式进行。
操作符 | 描述 |
---|---|
& | 如果相对应位都是1,则结果为1,否则为0 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 |
^ | 如果相对应位值相同,则结果为0,否则为1 |
~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 |
实例:
public class Test {
public static void main(String[] args) {
System.out.println(1&2);// 1:0001 / 2:0010 / 0000 1&2=0
System.out.println(1|2);// 0011 1|2=3
System.out.println(20 << 6);
// 补码:0001 0100 / 移位:00 0101 0000 0000 / 20<<6=1280
System.out.println(-20 >> 6);
// 原码:1001 0100 / 反码:1110 1011 / 补码:1110 1100 / 移位:1111 1111 / 反码:1111 1110 / 原码:1000 0001 / -20>>6=-1
System.out.println(20 >> 3);
// 补码:0001 0100 / 移位:0000 0010 / 20>>3=2
System.out.println(-20 << 3);
// 补码:1110 1100 / 移位:111 0110 0000 / 反码:111 0101 1111 / 原码:100 1010 0000 / -20<<3=-160
System.out.println(-20 >>> 3);
// 32位的补码:1111 1111 1111 1111 1111 1111 1110 1100 / 移位:0001 1111 1111 1111 1111 1111 1111 1101 / -20>>>3=536870909
}
}
注意:
-
右移位运算符>> 若操作值为正,则在高位插入0,若为负,则在高位插1。
-
右移补零运算符>>>无论操作值正负,均在高位插入0。
-
右移补零运算符>>>和右移位运算符>>若操作值为正,则结果相同。
-
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位 无符号右移运算符>>> 只是对32位和64位的值有意义。
逻辑运算符
A为true,B为false
操作符 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | A && B false |
|| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | A || B true |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !A false |
赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+= | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
-= | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
*= | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/= | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<<= | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>>= | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^= | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
|= | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
条件运算符( ? : )
条件运算符也被称为三元运算符,该运算符有3个操作数,并且需要判断布尔表达式的值,该运算符的主要是决定哪个值应该赋值给变量。
int a = 3>2 ? 1:0;
判断条件是否成立,若成立将返回第一个值,反之返回第二个值。
instanceof运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或者接口类型)。
String name = "zs";
boolean result = name instanceof String; // true
Java运算符优先级
下表中具有最高优先级的运算符在表的最上面,最低优先级在表的底部。
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () 、 [] 、 . (点操作符) | 从左到右 |
一元 | expr++ 、 expr-- | 从左到右 |
一元 | ++expr 、 --expr 、 ~ 、 ! | 从右到左 |
乘性 | * 、 / 、 % | 从左到右 |
加性 | + 、 - | 从左到右 |
移位 | >> 、 >>> 、 << | 从左到右 |
关系 | > 、 >= 、 < 、 <= | 从左到右 |
相等 | == 、 != | 从左到右 |
按位与 | & | 从左到右 |
按位异或 | ^ | 从左到右 |
按位或 | | | 从左到右 |
逻辑与 | && | 从左到右 |
逻辑或 | || | 从左到右 |
条件 | ? : | 从右到左 |
赋值 | = 、 += 、 -= 、 *= 、 /= 、 %= 、 >>= 、 <<= 、 &= 、 |= 、 ^= | 从右到左 |
逗号 | , | 从左到右 |
Java运算符括号和自增优先级问题:遇到括号时,默认从左到右计算,遇到括号立即执行括号里的内容。
例题:
1.
byte n = 5;
System.out.println(n++ + n++ * n++); // 5 + 6 * 7 / 47
2.
byte n1 = 5, n2 = 6;
System.out.println(n1-- + n1 << 2 + n1++ * --n2 >>2); // 5 + 4 << 2 + 4 * 5 >> 2 / 9 << 22 >> 2 / 9 << 20 / 9 * 2的20次方 / 9437184
3.
byte b1 = 8, b2 = 3;
int num = b1-- - b2++ * (++b1 * b1 << 2);// 8 - 3 * (8 * 8 << 2) / 8 - 3 * (64 << 2) / 8 - 3 * 256 / -760
System.out.println(num);
4.
byte b1 = 7;
byte b2 = 9;
byte b3 = 10;
byte b4 = 12;
System.out.println(b1 | b2 ^ b3 & b4);
// 7 | 9 ^ 10 & 12
// 10 & 12 : 1010 & 1100 / 1000
// 1000 ^ 9 : 1000 ^ 1001 / 0001
// 0001 | 7 : 0001 | 0111 / 0111
//7