运算符总的来说分:算术运算符、赋值运算符、关系/比较运算符、逻辑运算符、位运算符、三元运算符
1、算数运算符
+ - * / % ++ --
注意:
(1)byte/short/char在运算的时候自动提升为int
(2)整数的运算结果一定是整数
(3)小类型和大类型一起运算的结果一定是大类型
(4)任意整数/0 --ArithmeticException
非零数字/0.0 非零小数/0 --infinity 无限大
0.0/0.0 0/0.0 0.0/0 -NaN -非数字
%取模运算 -- 取余运算
9%4=1 3%5=3
-9%4=-1 -9%-4=-1 9%-4=1
%的结果的正负只与%的左边的正负有关,左边为正则为正,左边为负则为负
5%1.4=0.8 6.3%1.7=1.2
++/-- 自增或自减
++/--如果在变量之前,那么先自增或自减,然后参与后续运算
++/--如果在变量之后,那么先将值取出来参与运算,然后变量再自增或自减
如:
int i=6;
int j=i++ + ++i; -> 14(6+8)
int j=++i + i++; -> 14(7+7)
byte/short/char 都可以参加自增运算
char c='b';
int i=c+2; ->100
'a'~'z' ->97~122
'A'~'Z' ->65~90
'0'~'9' ->48~57
char c='0'
int i=c+3; ->51
2、赋值运算符
= += -= *= /= %= &= |= ^= <<= >>= >>>=
byte/short/char可以参与赋值运算
除了=以外,其余符号都要求这个变量得先有值
注意:在Java中不支持连等定义但是支持连等赋值
int i=5;
i+=i*=i-=3; -> 15
i=5+(5*(5-3));
int j=7;
j -= j *= j++; -> -42
j = 7 - (7 * 7);
3、关系/比较运算符
==(相等) !=(不等) >(大于) <(小于) <=(小于等于) >=(大于等于)
注意:不支持连着的比较方式
4、逻辑运算符
注意:逻辑运算符算的是逻辑值
&(与) |(或) !(非) ^(异或) &&(短路与) ||(短路或)
true&true=true true&false=false false&true=false
false&false=false
true|true=true true|false=true false|true=true
false|false=false
!true=false !false=true
true^true=false true^false=true false^true=true
false^false=false
&&:如果前边的表达式的结果为false,则后边的表达式不再运算,整个表达式的结果就确定为false
||:如果前边的表达式的结果为true,则后边的表达式就不再运算,整个表达式的结果就确定为true
注意:||如果在&&的前边可以把&&短路掉而&&不能
5、位运算符
注意:位运算符针对整数的补码进行运算,所以运算结果也是补码
& | ^ << >> >>> ~
>>:将数据转化为补码,然后按照指定的位数向右移动,移出的数据舍弃,如果是正数,高位补0,如果是负数高位补1。
~:取反运算,将数据转化为补码后,将所有0变1,1变0 ~i= - i - 1
交换值的方式
方式一:异或法
int i = 5, j = 9;
i = i ^ j;
j = i ^ j; -> j = i ^ j ^ j; -> j = i;
i = i ^ j; -> i = i ^ j ^ i; -> i = j;
方式二:加减法
int i =5, j = 9;
i = i + j;
j = i - j; -> j = i + j - j; -> j = i;
i = i - j; -> i = i + j - i; -> i = j;
方式三:追尾法
int i = 5, j = 9;
int temp = i;
i = j;
j = temp;
总结:三种方式的比较
异或法的效率是最高的。只能针对整数进行交换,局限性太大
加减法的效率是低于异或但是高于追尾。理论上可以交换数值类型,但实际上很少用于交换小数
追尾法的效率是最低的。可以交换任意一个类型的值
6、三元运算符
格式:逻辑值 ? 表达式1 : 表达式2
执行顺序:先执行逻辑值,如果逻辑值为true,则执行表达式1;反之则执行表达式2
三元表达式本身是一个表达式,意味着这个表达式执行完成之后需要有一个结果 --- 这个结果必须能定义对应类型的变量来接住
a > b ? “abc” : true; -> 没有办法定义一个统一类型的结果来存储,这种写法就是错误的
double d = a > b ? 3 : 5.25;
float f = a > b ? ‘a’ : 3.5f;
练习: 输出分数对应的等级 >=90-A >=80-B >=70-C >=60-D <60-E
扩展:从控制台获取数据
import java.util.Scanner;
Scanner s = new Scanner(System.in);
int i = s.nextInt(); // 获取整数
double d = s.nextDouble(); // 获取小数
String str = s.next(); // 获取字符串
7、运算符的优先级
从高到低:(~ ! ++ --) * / % + - 算术 << >> >>> 关系 逻辑 & | ^ 三元 赋值
一元>二元>三元>赋值