运算符主要分为: 算术运算符
关系运算符
逻辑运算符
位运算符
其他运算符
算术运算: 数字计算, 字符拼接
算术运算符 | 含义 | 样例 | 解释 |
---|---|---|---|
+ | 加 | z = x + y | 1+2=3 |
- | 减 | z = x - y | 2-1=1 |
* | 乘 | z = x * y | 2*4=8 |
/ | 除 | z = x / y | 6/3=2 |
% | 取模 | z = x % y | 5%2=1 |
++ | 递增 | x ++ | x+1 |
-- | 递减 | x -- | x-1 |
+= | 相加并赋值 | z += x | z = z+x |
-= | 相减并赋值 | z -= x | z = z-x |
*= | 相乘并赋值 | z *= x | z = z*x |
/= | 相除法并赋值 | z /= x | z = z/x |
%= | 取模并赋值 | z %= x | z = z%x |
- | 取负数 | z = -x | z = -x |
上面++比较特殊:
let b = 2
console.log(++b+b++) // 6
关系运算: 判断大小
关系运算符 | 含义 | 样例 |
---|---|---|
== | 等于 | x == y |
!= | 不等于 | x != y |
> | 大于 | x > y |
< | 小于 | x < y |
>= | 大于等于 | x >= y |
<= | 小于等于 | x <= y |
逻辑运算: 比较两侧的布尔值,然后返回true和false
逻辑运算符 | 含义 | 样例 | 解释 |
---|---|---|---|
& | 逻辑与 | x & y | 都为true返回true |
| | 逻辑与 | x|y | 有一个true返回true,即使x为true,依然会执行y |
^ | 逻辑异或 | x ^ y | 两侧布尔值相同返回false,不同返回true |
! | 逻辑非 | ! x | 取反 |
|| | 短路与 | x||y | 有一个true就直接返回true |
&& | 短路与 | x && y | 有一个false就直接返回false |
**上面需注意:比较时两侧必须是布尔值,否则会按位运算符进行运算,**短路运算只要前者达成就不再对后者进行判断
位运算: 将常量或变量,以二进制的方式,按位进行逻辑运算或移位计算,通常将0看为false,将1看为true
首先看下二进制1~10对应表
十进制 | 二进制 |
---|---|
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
原码最高位为0, 正数的原码,反码,补码相同
反码是为了弥补对负数的处理,负数的反码是在原码基础上,符号位不变(最高位为1),其余数值取反;
然而反码中数字0会有2个,正0和负0, 所以需要补码, 对所有负数
的反码进行+1操作, 从而合并正0和负0, 所以计算机的所有负数都是使用补码进行计算的
一个字节的表示范围是127~-128, -128是补码的特殊规定
十进制数字 | 原码 | 反码 | 补码 |
---|---|---|---|
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-3 | 1000 0011 | 1111 1100 | 1111 1101 |
-4 | 1000 0100 | 1111 1011 | 1111 1100 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
-6 | 1000 0110 | 1111 1001 | 1111 1010 |
-7 | 1000 0111 | 1000 1000 | 1111 1001 |
-128 | 无1 | 无 | 1000 0000 |
下表可能有误======解释稍后添加,涉及到移码,补码,原码,反码,后期补充
位运算符 | 含义 | 样例 | 解释 |
---|---|---|---|
~ | 按位非 | ~3(11) | |
& | 按位与 | z = x & y | 对应位都是1则为1,否则为0 |
| | 按位或 | z = x|y | 对应位都是0则为1,否则为0 |
^ | 按位异或 | z = x ^ y | 对应位不同则为1,否则为0 |
>> | 左移 | z = x << 2 | 2<<3 = 16 |
>> | 右移 | z = x >> 2 | 2>> 3 = 0 |
>>> | 前补 0 右移 | z = x >>> 2 |
条件运算符: 在javascript里称作三元表达式
条件: 返回一: 返回二 // 当条件为真返回前者一,否则返回二
instanceof运算符: 类似javascript里的typeof variable == type
**字符串连接运算符: ** +
, 和javascript一样,字符串和非字符进行拼接
运算符优先级:
单目运算符优先级高于多目运算符;算数运算符优先级高于关系运算符;关系运算符优先级高于逻辑运算符;逻辑运算符优先级高于赋值运算符。
案例列表:
// 类型转换 补位
public class learn2 {
public static void main(String[] args) {
// byte a = 12;
// a = a + 1; // 编译错误, 因为 a + 1 是 int 类型, 不能直接赋值给 byte 类型
byte b = 12;
int a = 0;
a = a + b; // 正确, 因为 b 是 byte 类型, a + b 是 int 类型, 可以直接赋值给 int 类型
// 内存空间小的 可以 自动补位
System.out.println(a);
byte c = 3;
// c= c+ 3; 错误
c += 3; // 正确, 因为 c += 3 相当于 c = (byte)(c + 3), 会自动进行类型转换; 但是值超出127的话会丢失精度
System.out.println(c);
}
}
参考文章: 运算符、表达式和语句