运算符
变量+运算符=表达式
算术运算符+ - * / %
-
做除法和取模时,右操作数不能为0
-
两侧操作数类型不一致时,向类型大的提升
System.out.println(5/2);//2 System.out.println((float)5/2);//2.5 System.out.println(5/(float)2);//2.5 System.out.println((float)(5/2));//2.0 先运算得2在强转 System.out.println(10%3);//1 System.out.println(10%-3);//1 商-3余1 System.out.println(-10%3);//-1 商-3 余-1 System.out.println(-10%-3);//-1 商3 余-1 System.out.println(11.5%2);//1.5 商5 余1.5 Java允许小数取余
short sh=12; sh=sh+2;//会报错,因为2是int sh类型提升为4个字节无法赋给sh sh+=2;//不会报错,理解为帮我们进行了类型的强制转换
关系运算符
> >= < <= != ==
1>=5;返回值是false System.out.println(3<a<100);//编译不通过,因为3<a为true.不能和100比
&& || !
1.表达式1&&表达式2
表达式1和表达式2都是布尔表达式,要么是true要么是false
如果表达式1为真,那么就去执行表达式2,如果表达式也为真,那么整体为真 如果表达式1为假,那么就不会执行表达式2,发生短路
1/0会报错,ArithmeticException:算数异常
:/ by zero 除0了
2.表达式1 || 表达式2
如果表达式1为真,就不执行表达式2.整体已经为真,发生短路
如果表达式1为假,就继续执行表达式2,表达式2为真,整体为真
int a=0 System.out.println(a==0|| (1/0)==0);//不会报错,因为不会执行1/0
3.逻辑非
!true=false
!false=true
&:按位与,如果左右都是布尔类型,也能当作逻辑与用,但不会出现短路情况
位运算符
1.&按位与
对应位按位取与
0000 1011 11 0000 1101 13 & =0000 1001
2.| 按位或
对应位按位取或
3.^ 按位异或
0010 1011 0001 1010 ^ =0011 0001 计算逻辑:对应位不一样就是1,一样就是0
-
两个相同的数字异或结果是0
-
0^任何数字=任何数字
-
当&和 | 的操作数为整数的时候,表示按位运算,当操作数为布尔类型的时候,表示逻辑运算
4.按位取反~
如果该位为0则转为1,如果该位为1则转为0
移位运算符
1.<< 左移
0000 1011 <<1 11 =0001 0110 22=11*21
0000 1011 <<2 11 =0010 1100 44=11*22
-
x左移n位就相当于x乘2n
-
左移补零
2.>>右移
0000 1011>>1 11 =0000 0101 5=11/21
-
正数x右移n位就相当于x除2n
-
右移补的是符号位
1111 1111>>1 =1111 1111
3.无符号右移>>>
1111 1111 >>>1 =0111 1111
-
无符号右移统统补零
-
没有无符号左移
4.注意
-
计算机计算移位效率高于计算乘除,当某个代码正好乘除2的N次方的时候可以用移位运算代替
-
移动负数位或者移位位数过大都没有意义
三目运算符
-
布尔表达式1 ? 表达式2 : 表达式3
当表达式1为真的时候,返回表达式2,否则返回表达式3的结果
System.out.println((true == true)?(true == true) ? false : true : true);//false //(true == true)表达式1 //(true == true) ? false : true 表达式2 //true 表达式3 //表达式1为真,返回表达式2,表达式2又是个三目运算符 //表达式2的三目运算符的返回值为false
-
表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换
int a=10; int b=20; int c=a>b?1:2.0//若返回的是2.0,则放生隐式类型转换
-
表达式不能单独存在,其产生的结果必须要被使用
int a=10; int b=20; a>b?a:b;//报错:Error:(15,14)java:不是语句