2.7 运算符
2.7.1 算术运算符
(1) + - * / %(求余) ++(自加) --(自减)
+ 加 比如:3+5=8 //还可做为连接符
- 减 比如:3-5=-2
* 乘 比如:3*5=15
/ 除 比如:3/5=0
% 除之后取余数 比如:3%5=3
++ 自加 比如:a=3 a++后 a=4
-- 自减 比如:a=3 a--后 a=2
如: 5/2=2 (5和2都是整数时为2,取整数部分,因为两int运算,结果为int)
5.0/2.0=2.5 (5.0和2.0是小数,那结果是小数2.5)
5%3=2 (%表示取余)
a=2;b=a++; (运算后b是2,a是3)
a=2;b=++a; (运算后b是3,a也是3)
(2) 指定保留的小数位数
BigDecimal 变量名=new BigDecimal(小数);
承载变量名=变量名.setScale(保留的小数位数,ROUND_HALF_UP).doubleValue();
2.7.2 赋值运算符
(1) 赋值: =
(2) 与算术运算符联合用
赋值运算符可与算术运算符、位移运算符结合,扩展成功能更加强大的运算符。扩展后的赋值运算符如下:
+=: 对于x+=y, 即对应于x=x+y
-=: 对于x-=y, 即对应于x=x-y
*=: 对于x*=y, 即对应于x=x*y
/=: 对于x/=y, 即对应于x=x/y
%=: 对于x%=y, 即对应于x=x%y
&=: 对于x&=y, 即对应于x=x&y
|=: 对于x|=y, 即对应于x=x|y
^=: 对于x^=y, 即对应于x=x^y
如:①a+=5和②a=a+5数值是一样的,但千万要注意a的类型,①中a的类型不会 变,②中a的类型可以改变。
2.7.3 比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于 (比较变量的物理地址,对比equals比较变量的值)
!= 不等于
2.7.4 逻辑运算符
- && 并且 计算时短路
(2) & 并且 计算时不短路
(3) || 或者 计算时短路
(4) | 或者 计算时不短路
(5) ! 否定的,相反的
(6) ^ 异或 比较^两边的逻辑运算结果,同则假,不同则真,计算时不短路
例1:
public class WithOrText{
public static void main(String[] args){
int oneNum=10;
int twoNum=38;
int threeNum=10;
int fourNum=38;
int fiveNum=62;
int sixNum=83;
int sevenNum=62;
int eightNum=83;
//短路与&&
System.out.println("-----------短路与&&-----------");
if(oneNum++>15&&twoNum++<20){
System.out.println("true: oneNum:"+oneNum+" twoNum:"+twoNum);
}else{
System.out.println("false: oneNum:"+oneNum+" twoNum:"+twoNum);
}
//非短路与&
System.out.println("-----------非短路与&----------");
if(threeNum++>30&fourNum++<50){
System.out.println("true: threeNum "+threeNum+" fourNum:"+fourNum);
}else{
System.out.println("false: threeNum "+threeNum+" fourNum:"+fourNum);
}
//短路或||
System.out.println("-----------短路或||-----------");
if(fiveNum++<90||sixNum++>50){
System.out.println("true: fiveNum: "+fiveNum+" sixNum:"+sixNum);
}else{
System.out.println("false: fiveNum: "+fiveNum+" sixNum:"+sixNum);
}
//非短路或|
System.out.println("-----------非短路或|----------");
if(sevenNum++<90|eightNum++>50){
System.out.println("true: sevenNum: "+sevenNum+" eightNum:"+eightNum);
}else{
System.out.println("false: sevenNum: "+sevenNum+" eightNum:"+eightNum);
}
}
}
例2:
使用逻辑运算符实现润年的计算,(润年:①能被4整除且不能被100整除的年份
②能被400整除的年份)
public class LeapYear{
public static void main(String[] args){
int year=2016;
if(year%4==0&&year%100!=0||year%400==0){ //满足其中之一都是润年
System.out.println(year+"是润年");
}else{
System.out.println(year+"不是润年");
}
}
}
2.7.5 位运算
(1)“按位与”运算 & 有0出0
00000000 00000000 00000000 00000101 =5
11111111 11111111 11111111 11111100 =-4
结果:
00000000 00000000 00000000 00000100 =4
(2)“按位或”运算 | 有1出1
00000000 00000000 00000000 00000011 =3
00000000 00000000 00000000 00000110 =6
结果:
00000000 00000000 00000000 00000111 =7
- “按位取反”运算 ~ 所有的0修改为1 1修改为0
00000000 00000000 00000000 00000111 =7
结果:
11111111 11111111 11111111 11111000 =-8
- “按位异或”运算 ^ 相同为0,不同为1
00000000 00000000 00000000 00001010 =10
00000000 00000000 00000000 00000011 =3
结果:
00000000 00000000 00000000 00001001 =9
- 移位操作
① << 左移 一个数左移n位=这个数乘以2的n次方(2n) 4<<3 -> 4*23
② >> 右移 一个数右移n位=这个数除以2的n次方(2n) 8>>3 -> 8/23
③ >>> 无符号右移
位移总结(1)byte , short , char类型在做位移运算时,会自动提升数据类型为int
(2)int , long的数据在移动超出空间位值(32或64位)时,先给移动的位置 数除(32或64)后取余,余数就是移动的位数
(3)右移越界的数据都丢失,左边移出的空位,按原来符号位为1就全补1,否 则全补0。
2.7.6 三目运算符
(1)逻辑运算式? 值1:值2;
类型 名字= 逻辑运算式? 值1:值2;
//逻辑运算式如为true则得到值1,为false得到值2。获取的值需要定义变
//量来承接,该变量的类型需要和值1、值2一样。
如:char c=3<4? ‘对’:‘ 错’ 结果为 对
- 逻辑运算式?表达式1:表达式2;
//逻辑运算式为true则运算表达式1,否则运算表达式2
- 逻辑运算式?逻辑运算式?表达式1:表达式2:表达式3;
注:多重三目运算嵌套,从右往左的顺序运算
2.7.7 运算符优先级表