Java运算符
2021/2/28 周日
复习内容: 算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符
如有错误,欢迎在评论区指出,非常感谢!
运算符(操作符)就是对数据进行处理的方式
在进行混合类型运算时,会进行类型转换,结果会自动转换成类型最宽的那个类型:
byte -> short -> int -> long -> float -> double
char -> int
一、算术运算符
+ - * / % ++ --
加 减 乘 除 取模(求余) 加1 减1
-
byte\short\char在进行算术运算(除++ --以外)时,都将转换成int
-
任何数据都可以转换成字符串,当字符串中使用+时,其实是字符串拼接
-
算术运算符是从左往右进行运算,所以以下结果将不一样:
int+int+String
String+int+int如 int a = 10; int b = 20;
a + b + “c” 的结果为 30c
“c” + a + b 的结果为 c1020 -
乘法 *
以下结果不一样:
long a = 365 * 24 * 60 * 60 * 1000 * 100L; // 147,122,892,800
long b = 365L * 24 * 60 * 60 * 1000 * 100; // 3,153,600,000,000a在最后乘以100L之前,一直是以int进行计算,由于前面的乘积31,536,000,000远大于int的最大值2,147,483,647,会出现数据溢出,即使最后再乘一个long类型的100L,计算结果也已经不准确了。
所以当乘法预计结果会比较大的时候,最好一开始就指定数据类型365L,让整个表达式都以long来计算。
-
除法 /
对于整数除法,结果是整除。
以下结果不一样:
double c = 10/3; // 3.0
double d = 1.0*10/3; // 3.3333333333333335与前面一样,c是先以int运算再转化成double,对于int整数,/为取整;d是直接转换成了double来进行计算。
-
取模(求余)%
求余数。java中,对于浮点类型也可以进行求余运算。用途:
(1) 判断是否整除,若m能够被n整除,则余数为0
9能够被3整除,所以 9%3 == 0 结果为true;而10%3 == 0 结果为false(2) 判断m是不是偶数,偶数能够被2整除
-
自增运算符 ++
如果x的初始值都为1
++x; // 前加加 x = x+1;
x++; // 后加加 x = x+1;前后++的本质:
z = ++x; // 即 x = x+1; z = x; 运算后x的值为2,z的值也为2
z = x++; // 即 z = x; x = x+1; 运算后x的值为2,但z的值为1
在同一个表达式中,不应该对同一个变量进行多次自增减运算
前面说过byte\short\char在进行除++ --以外的算术运算时会转换成int ,而在++ – 运算时,其数据类型不变。
byte b = 1;
++b; // 没问题
b = b+1; // 会报错
因为=右边b+1中的1默认为int型,所以b+1的结果是int型,但=左边的b在上面声明的是byte类型,int无法自动转为byte,所以报错。可以使用强制类型转换:
b= (byte)(b+1);
java中对浮点类型也是可以进行自增减运算的:
double b = 1.5;
++b;
// b的值为2.5
-
自减运算符 - -
–x; 前减减 x = x-1;
x–; 后减减 x = x-1;性质特点与++类似
二、关系运算符(比较运算符)
关系运算符 > >= < <= != ==
关系运算符的结果是boolean类型,其值只会是true或者false
x > y , 如果x>y成立则为true,否则为false
关系要么成立(true),要么不成立(false),应用于条件判断
注意,x == y 是判断相等,这里有两个=等号。而Java中一个=等号是赋值语句
三、逻辑运算符 && || !
&& 逻辑与 ; || 逻辑或 ; ! 逻辑非 (逻辑取反)
在编程过程中,逻辑运算符多数情况下都是连接关系运算符(结果是true或者false)
x y x&&y x||y !x
true true true true false
true false false true false
false true false true true
false false false false true
总结:
&&: 只有当&&两边的结果都为true时结果才为true
| | : 只要两边有一个为true结果就为true
短路特性:如果逻辑运算符右边的结果,对整个表达式的结果无法产生影响时,将不再运算
-
&&连接的多个表达式是从左往右运算,如果&&左边的表达式的结果为false时,&&右边的表达式将不会再进行运算
false&&epxr 中epxr不会运行到
-
| | 连接的多个表达式,如果||左边表达式的结果为true时,||右边的表达式将不再进行运算
true | | expr 中epxr不会运行到
四、赋值运算符
= += -= *= /= %=
= 给变量赋值 让变量保存某个数据
num *= x; // 相对于 num = num*x;
num /= x; // 相对于 num = num/x;
注意num一定是在运算符的左边
五、位运算符
& | ^ ~ >> >>> <<
按位(二进制位)进行运算
1. & 按位与
二进制位:1&1=1 ; 1&0=0 ; 0&1=0 ; 0&0=0
如 int x=10,y=20;
x&y; 表示 x和y的二进制相同的位进行按位与运算
10 : 00000000 00000000 00000000 00001010
20 : 00000000 00000000 00000000 00010100
得 : 00000000 00000000 00000000 00000000
所以 x&y 的值为0
定理:
-1&num = num 因为-1的补码为 11111111 11111111 11111111 11111111
0&num = 0 因为0的补码为 00000000 00000000 00000000 00000000
2. | 按位或
二进制位:1|1=1; 1|0=1 ; 0|1=1; 0|0=0
定理:
-1|num = -1
0|num = num
3. ^ 按位异或,不相同则为1
二进制位:1^1=0; 1^0=1; 0^1=1; 0^0=0
定理:
num^num = 0
0^num = num
-1^num = -(num+1)
利用异或可以还实现交换算法而不必使用临时变量,例:
num1 = num1 ^ num2;
num2 = num2 ^ num1;
num1 = num1 ^ num2;
结果是num1和num2的值进行了交换
4.~ 按位取反
二进制位:~0=1 ; ~1=0
-1^num = ~num = -(num+1) = -num-1
~num+1 = -num 负数求补码
5.>> 带符号循环右移
右边移出的位舍弃,左边空出的位补符号位
num>>n == num>>(n%32) == num/2^(n%32)
每向右移一位相当于除以2(除去负的奇数)
6.>>> 无符号循环右移
右边移出的位舍弃,左边空出的位补0
7.<< 循环左移
左边移出的位舍弃,右边空出的位补0
每向左移一位相当于乘以2
将位运算符组合,可以用于求平均值:
假设有x y 两个整数
int z = (x&y)+((x^y)>>1);
z的结果为(x+y)/2
六、条件运算符 ?:
又叫三目运算符或三元运算符,其操作数有三个
expr1?expr2:expr3;
表示如果expr1结果为true,则该表达式的结果为expr2的结果,否则为expr3的结果
七、其它
分量运算符 .,
下标运算符 []
实例运算符 instanceof 检查是否是某个类的对象
方法调用运算符()
等
八、运算符的优先级:
一般来说,优先级是:
算术 > 位
算术 > 关系 > 逻辑
有时无法确定运算符的优先级,所以编程时一般会使用()来确定优先级的顺序