算术运算符
除法
整数相除,只能得到整数,
小数部分全部舍去
要想得到小数,可以*1.0,先把操作的数据中任意的一个数据变为浮点数,再做运算
//a 5 b 4
System.out.println(a / b);//1
System.out.println(a * 1.0 / b );//1.25
System.out.println(a / b * 1.0);//1.0
+的几种作用
- 加法
- 正数
- 字符串连接符
这里其实是字符串的连接
System.out.println("hello"+'a'+1); //helloa1
System.out.println('a'+1+"hello"); //98hello
System.out.println("5+5="+5+5); //5+5=55
System.out.println(5+5+"=5+5"); //10=5+5
/和%的区别
- 数据做除法操作的时候,/取得是商,%取得是余数
自增和自减
作用是对变量进行自增1或者自减1
- 单独使用效果相同
- 参与运算使用,在操作数的前后效果不同
- 放在操作数的前面++a:先自增或者自减,再参与操作
- 放在操作数的后面a++:先参与操作,再自增或者自减
int a = 10;
int b = 10;
int c = 10;
a = b++;// a 10 b 11 c 10
c = --a;// a 9 b 11 c 9
b = ++a;// a 10 b 10 c 9
a = c--;// a 9 b 10 c 8
int a = 4;
int b = (a++)+(++a)+(a*10);//4+6+60=70
运算符优先级
赋值运算符
- 基本的赋值运算符: =
- 扩展的赋值运算符: +=, -=, *=, /=, %=
面试题
下面两个代码有没有问题,如果有,那里有问题
short s = 1;
s = s + 1;
short s = 1;
s += 1;
s += 1
为int类型,需要强制转换才能赋值给short
+=运算符有一个隐含的默认转换功能,s+=1等价于s=(s的数据类型)(s+1);
关系运算符
- 比较运算符的结果都是boolean型,也就是要么是true,要么是false
- 比较运算符
==
不能误写成=
int a=1;
int b=3;
System.out.println(a == b);//true
System.out.println(a = b-1);//2 把b-1赋值给a,然后把a留下来
boolean b1 = true;
boolean b2 = false;
boolean b3 = (b1 == b2);//false
//boolean flag = (b1 = b2); //这个是有问题的,不兼容的类型
boolean b4 = (b1 = b2);//false
逻辑运算符
逻辑运算符用于连接布尔型表达式
&
:有false则false|
:有true则true^
:相同false,不同非false则truetrue!
:,非true则false
&和&&、|和||的异同
- 结果相同
- 逻辑与
&
和逻辑或|
:左边无论真假,右边都进行运算; - 短路与
&&
:具有短路效果,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 - 短路或
||
:具有短路效果,如果左边为假,右边参与运算,如果左边为真,那么右边不参与运算。
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5));//false
System.out.println(x);//4
System.out.println(y);//5
System.out.println((x++ > 4) && (y++ > 5));//false
System.out.println(x);//5
System.out.println(y);//5
位运算符
位运算是直接对二进制进行运算
&
:遇0则0 任何二进制位和0进行&
运算,结果是0;和1进行&
运算结果是原值。|
:有1则1 任何二进制位和0进行|
运算,结果是原值;和1进行|
运算结果是1。^
:相同为0不同为1 任何相同二进制位进行^
运算,结果是0;不相同二进制位 ^ 运算结果是1。
int a = 3;
int b = 4;
System.out.println(3 & 4);//0
System.out.println(3 | 4);//7
System.out.println(3 ^ 4);//7
System.out.println(~3);//-4 -n=~n+1
分析:因为是位运算,所以我们必须先把数据换算成二进制。
3的二进制:11
00000000 00000000 00000000 00000011
4的二进制:100
00000000 00000000 00000000 00000100
&位与运算:有0则0。
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000000
结果是:0
|位或运算:有1则1。
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
^位异或运算:相同则0,不同则1。
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
~按位取反运算符:0变1,1变0
00000000 00000000 00000000 00000011
~ 11111111 11111111 11111111 11111100 (补码)
补码: 11111111 11111111 11111111 11111100
反码: 11111111 11111111 11111111 11111011
原码: 10000000 00000000 00000000 00000100
结果是:-4
^运算符的特点
一个数据对另一个数据位异或两次,该数本身不变
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;//(a^b)^b = a
a = a ^ b;//(a^b)^a = b
System.out.println(a);//20
System.out.println(b);//20
移位运算
<<
:就是将左边的操作数在内存中的二进制数据左移右边操作数指定的位数,右边被移空的部分补0,左边最高位丢弃。相当于乘与2的倍数>>
:右移稍微复杂一点,如果最高位是0,左边被移空的位就填入0;如果最高位是1,左边被移空的位就填入1。相当于除以2的倍数>>>
:无论最高位是1还是0,左边被移空的高位都填入0。
System.out.println(3 << 2);//12
System.out.println(24 >> 2);//6
System.out.println(24 >>> 2);//6
System.out.println(-24 >> 2);//-6
System.out.println(-24 >>> 2);//1073741818
无符号位移分析过程
-24
源码: 00000000 00000000 00000000 00011000
反码: 11111111 11111111 11111111 11100111
补码: 11111111 11111111 11111111 11101000
无符号右移: 00111111 11111111 11111111 11111010 2^32-2^2-2^0-1=1073741818
面试题
请用最有效率的方式写出计算2乘以8的结果?
2 << 3
三目运算符
单目运算符:~3
双目运算符:3 + 4
三目运算符:
格式:(比较表达式)?表达式1:表达式2
- 如果比较表达式为true,运算后的结果是表达式1
- 如果比较表达式为false,运算后的结果是表达式2
所有的三元运算符能够实现的,if语句的第二种格式都能实现。
反之不成立。
如果if语句第二种格式控制的语句体是输出语句,就不可以。
因为三元运算符是一个运算符,必须要有一个结果返回,不能是一个输出语句。
以上概念总结于传智播客Java基础课程