文章目录
一、什么是运算符
计算机的最基本的用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。
Java中运算符可以分为以下:
二、算术运算符
1. 基本四则运算符:加减乘除模(+ - * / %)
- 加减 + -
System.out.println(3 + 2); //5
System.out.println(3 - 2); //1
- 除法 /
System.out.println(5 / 2); //2
System.out.println((float)5 / 2); //2.5 ——>对5进行强转 5.0/2=>此时把2提升到了float 2.0————>所以结果是2.5
System.out.println(5 / (float)2); //2.5 与上述同理
System.out.println((float)(5/2)); //2.0 先运算5/2=2,把结果2进行了一个强转,结果为2.0
- 模 %
System.out.println(10 % 3); //1 10/3=3……1
System.out.println(10 % -3); //1 10/-3=-3……1
System.out.println(-10 % 3); //-1 -10/3=-3……-1
System.out.println(-10 % -3); //-1 -10/-3=3……-1
System.out.println(11.5 % 2); //1.5
2. 增量运算符(+= -= *= %=)
a += 2;相当于 a = a + 2;
short sh = 12;
sh = sh + 2; //编译出错,因为2是int型。对2字节的sh也做了一个提升。4字节+4字节装到2字节的sh中,发生编译错误,此时如果进行强制转换,可能会发生数据丢失。
sh += 2; //编译成功,可理解为,帮助我们进行了一个类型的转换
3. 自增/自减运算符(++ --)
++ 是给变量的值+1,–是给后置的值-1
- 如果单独使用,++a 和 a++,没有任何区别
int a = 10;
++a;
System.out.println(a); //11
int a = 10;
a++;
System.out.println(a); //11
-
如果混合使用
- ++a:先+1,再赋值(先+1,再使用变量+1之后的值)
- a++:先赋值,再+1(先使用变量原来的值,表达式结束时给变量+1)
int a = 10;
int b = ++a; // a = a+1; b = a;
System.out.println(a); //11
System.out.println(b); //11
int a = 10;
int b = a++; // b = a; a = a+1;
System.out.println(a); //11
System.out.println(b); //10
同理
int i = 10;
i = i++;
System.out.println(i); //10
此结论需要看Java的汇编,只需要记住这个结论就好了
- 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改
三、关系运算符
-
关系运算符主要有六个:== != < > <= >=
-
其计算结果是true或者false
System.out.println(1 < 5); //true
System.out.println(1 > 5); //false
System.out.println(1 == 5); //false
System.out.println(1 != 5); //true
System.out.println(1 <= 5); //true
System.out.println(1 >= 5); //false
四、逻辑运算符(重点!)
- 逻辑运算符有三个:&& || !
- 其运算结果都是boolean类型
1. 逻辑与(短路与) &&
语法规则:布尔表达式1 && 布尔表达式2
特点:
- 表达式1为真,那么执行表达式2,如果表达式2也为真1则整体为真
- 如果表达式1为假,那么不会执行表达式2(短路与:当表达式2为真也不执行了)
int a = 1;
System.out.println(1/0); //报了异常,此时是算数异常
System.out.println(a == 2 && 1/0); //false; 不会报异常是因为短路与的原因,后面没执行
2. 逻辑或 ||
语法规则:布尔表达式1 || 布尔表达式2
特点:
- 如果表达式1为真,就不执行表达式2,整体为真,发生短路!
- 如果表达式1为假,就继续执行表达式2,表达式2为真,整体为真
- 左右表达式至少有一个为真,则结果为真
3. 逻辑非 !
语法规则:!表达式
特点:真变假,假变真。
int a = 1;
System.out.println(!(a == 1)); //a == 1为true,取个非就是false
4. 短路求值
上述讲过的 && 和 || 的短路情况
- 对于对于 &&,如果左侧表达式值为 false,则表达式结果一定是 false,无需计算右侧表达式
- 对于 ||,如果左侧表达式值为 true,则表达式结果一定是 true,无需计算右侧表达式
- & 和 | 如果表达式结果为 boolean 时,也表示逻辑运算. 它们和 && || 的区别在于,它们不支持短路求值
//此时 &(按位与)运算符,如果左右两边都是布尔类型,那么也相当于逻辑运算
//区别是 不能进行短路求值了
int a = 1;
System.out.println(a == 2 & 1/0); //此时会报算数异常
五、位运算符
1. 按位与 &
按比特位与
如果两个二进制位都是 1,则结果为 1,否则结果为 0
2. 按位或 |
如果两个二进制位都是0,则结果为0,否则结果为1
3. 按位取反 ~
如果该位为0,则转为1,如果该为为1,则转为0
4. 按位异或^
相同为0,不同为1
特点:
-
两个相同的数字异或,结果是0
-
0 异或任何数组,结果都等于其本身
六、移位运算符
1. 左移 <<
左移:右边加0,最左侧最不要了,左移相当于乘法
0000 1011 (11)
0000 1011 << 1 —> 0000 0110 (22)相当于11 * 21
0000 1011 << 2 —> 0010 1100 (44)相当于11 * 22
2. 右移 >>
右移:左边加0,右移相当于除法,补符号位(正数补0,负数补1)
0000 1011 >> 1 —> 0000 0101 (5) 11 / 21
0000 1011 >> 2 —> 0000 0010 (2) 11 / 22
右移相当于除法,但是这个结论适用于正数,负数就不适用了(如:-1是特殊的,前后不变)
1111 1111 (-1)
1111 1111 >> 1 —> 1111 1111 (-1)
3. 无符号右移 >>>
统统在左边补0
注意:
- 左移 1 位,相当于原数字 * 2,左移 N 位, 相当于原数字 * 2 的N次方
- 右移 1 位,相当于原数字 / 2,右移 N 位, 相当于原数字 / 2 的N次方
- 由于计算机计算移位效率高于计算乘除,当某个代码正好乘除 2 的N次方的时候可以用移位运算代替
- 移动负数位或者移位位数过大都没有意义
七、条件运算符
语法规则:表达式1?表达式2:表达式3
解释:表达式1是Boolean表达式,当1为真,返回2,否则返回3
举个复杂的例子证明你会了:
boolean flg = (true == true) ? (true == true) ? false : true : true;
System.out.println(flg);
答案为:false
解析:
我们知道条件运算符的语法规则是:表达式1?表达式2:表达式3 所以我们找出各个表达式即可。
①先找出大方向的表达式1、2、3
②其中表达式2中又嵌套着表达式1、2、3;且表达式2最终结果为false
③得出最终结果 false
八、运算符的优先级
运算符之间是有优先级的,具体的规则不必记忆,在可能存在歧义的代码中加上括号即可!