计算机的最基本的用途之一就是执行数学运算。
一、算数运算符
1、基本四则运算符:加减乘除模(+ - * / %)
- 都是二元运算符;
- int/int 结果还是int,向下取整;
- 除法和模运算的右数不能为0;
- %可以给浮点数取模;
- 两个操作数类型不一致时,会发生类型提升(2.6)。
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
System.out.println(510/0); //异常
System.out.println(10%3); //1
System.out.println(-10%3); //-1
System.out.println(10%-3); //1
System.out.println(-10%-3); //-1
System.out.println(10.5%3); //1.5
2、增量运算符:+= -= *= /=
- 操作符完成后,会将操作的结果赋值给左操作数;
- 做操作数必须为变量。
- 自动进行强制类型转换
int a = 10;
float b = 5.0f;
a += b; //a == 15
a = a + b; //异常,正确写法a = (int)(a + b);
3、自增/自减运算符:++ --
- 只有变量才能使用自增/自减运算符
int a = 10;
a = a++; //a == 10
二、关系运算符:== != < > <= >=
- 运算结果都是Boolean类型。
- 需要多次判断是不能连写,像3<a<5这样的写法是错误的。
三、逻辑运算符:&& || !
运算结果都是Boolean类型。
1、逻辑与&&
表达式1 && 表达式2,两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
2、逻辑或||
两个表达式都为假,结果才是假,只要有一个是真,结果就是真。
3、逻辑非!
真变假,假变真。
4、短路求值规则
-
对于 &&,如果左侧表达式值为 false,则表达式结果一定是 false,无需计算右侧表达式;
-
对于 ||,如果左侧表达式值为 true,则表达式结果一定是 true,无需计算右侧表达式;
-
& 和 | 如果表达式结果为 boolean 时,也表示逻辑运算,但与 && || 相比,它们不支持短路求值。
四、位运算符:& | ~ ^
按位运算就是在按照二进制位的每一位依次进行计算。位运算符中除 ~是一元运算符外,其余都是二元运算符。
- 按位与&:都是1,结果为1,否则为0;
- 安慰或|:都是0,结果为0,否则为1;
- 按位取反~:0变1,1变0;
- 按位异或^:相同为0,相异为1。
五、移位运算:<< >> >>
都是二元运算符,都是按照二进制比特位来运算的。
1、左移<<:整体左移,左侧丢弃,右侧补0;
- 左移时符号位会被丢弃,因此正数左移可能会变成负数。
2、右移(算数右移)>>:整体右移,右侧丢弃,左侧补符号位(正数补0,负数补1);
3、无符号右移(逻辑右移)>>>:整体右移,右侧丢弃,左侧补0。
注意:
- 左移1位,相当于原数字*2;左移N位,相当于原数字*2^N。
- 右移1位,相当于原数字/2;右移N位,相当于原数字/2^N。
由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 的 N 次方的时候可以用移位运算代替。 移动负数位或者移位位数过大都没有意义。
六、条件运算符:表达式1 ? 表达式2 : 表达式3
当表达式1的值为true时,整个表达式的值为表达式2的值;当表达式1的值为false时,整个表达式的值为表达式3的值。这是Java中唯一的一个条件运算符,也是唯一的一个三目运算符。
注意:
表达式不能单独存在,其产生的结果必须要被使用。
boolean flg = true == true ? false ? true : false : true;
//flg == false,原因:flg = true == true ? (false ? true : false) : true;
七、运算符优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,有些情况下稍不注意,可能就会造成很大的麻烦。
优先级(数字越小优先级越高) | 运算符 | 结合性 |
1 | ( ) [ ] . | 从左到右 |
2 | ! ~ ++ – | 从右到左 |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | << >> >>> | 从左到右 |
6 | < <= > >= instanceof | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ? : | 从左到右 |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= | 从右到左 |
15 | , | 从右到左 |
运算符之间是有优先级的。具体的规则我们不必记忆,在可能存在歧义的代码中加上括号即可。