目录
一.算术运算符
1. 1基本四则运算符:加减乘除模(+ - * / %)
1.int/int型会向下取整
2
2./和%的右操作数不能是0
例如如果执行下面的代码
System.out.println(2/0);
System.out.println(2%0);
编译器会显示出现算数异常
3.%不仅可以对整型取模,也可以对浮点型取模(但是没有意义)
4.两侧操作数不一致时,会发生整型提升
1.2增量运算符 += -= *= %=
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
来看一段神奇的代码
只有变量才能使用该运算符,常量不能使用
1.3自增/自减运算符 ++/--
++
是给变量的值
+1
,
--
是给变量的值
-1
前置++和后置++的区别就在于前置++会先让变量自增1,然后返回变量的值,后置++会先返回变量的值,然后变量自增1
前置--和后置--的用法与++相似
只有变量才能使用++/--,常量不能使用
二.关系运算符
关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false (boolean类型)
注意:当需要多次判断时,不能连着写,比如:
3 < a < 5
3<a会返回true或者false的布尔型常量,不能与int常量5进行关系判断
三.逻辑运算符
逻辑运算符主要有三个: && || ! ,运算结果都是 boolean类型
3.1逻辑与&&
两个表达式都为真,结果才是真,只要有一个是假,结果就是假
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 假 |
假 | 真 | 假 |
假 | 假 | 假 |
3.2逻辑或||
表达式1 ||
表达式
2
,左右表达式必须是
boolean类型的结果
表达式1 | 表达式2 | 结果 |
真 | 真 | 真 |
真 | 假 | 真 |
假 | 真 | 真 |
假 | 假 | 假 |
3.3逻辑非!
真变假,假变真
表达式 | 结果 |
真 | 假 |
假 | 真 |
3.4短路求值
&&和||会遵循短路求值的规则:
- 进行&&运算时,当第一个表达式的结果为假,第二个表达式不再进行运算,返回false
- 进行||运算时,当第一个表达式的结果为真,第二个表达式不再进行运算,返回true
我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值
同样可以进行逻辑与/逻辑或运算,&和|并不支持短路规则,其左右表达式都会参与运算
四.位运算符
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位 的每一位依次进行计算.
4.1按位与&
如果两个二进制位都是
1,
则结果为
1,
否则结果为
0
4.2按位或|
如果两个二进制位都是
0,
则结果为
0,
否则结果为
1
- &和|当左右操作数为逻辑表达式时,会进行逻辑运算;当左右操作数为整数时会进行按位运算。但是推荐将&和|当做位运算符使用
4.3按位取反~
如果该位为 0
则转为
1,
如果该位为
1
则转为
0
4.4按位异或^
如果两个数字的二进制位相同
,
则结果为
0,
相异则结果为
1
可以得出两个简单的结论:
- n^n=0
- n^0=n
五.移位运算符
移位运算符有三个
:
<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的
5.1 左移<<
最左侧位不要了, 最右侧补 0
- 向左移位时,丢弃的是符号位,因此正数左移可能会变成负数
- 左移n位相当于*2的n次方
5.2 右移>>
最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
- 右移n位相当于/2的n次方
5.3 无符号右移
最右侧位不要了, 最左侧补 0
- 无符号右移可能会把负数变成正数
- 没有无符号左移,因为左移操作符会直接在右侧补0
移动负数位或者移位位数过大都没有意义
六.条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
例如
- 表达式2和表达式3的结果必须是同类型的,除非能发生类型隐式类型转换
- 表达式不能单独存在,其产生的结果必须要被使用
来看一个简单的练习
答案分别是false和true,你做对了吗
七.运算符的优先级
在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如:
*
和
/
的优先级要高于
+ 和 -
,有些情况下稍不注意,可能就会造成很大的麻烦。
在上图中,由于+的优先级要高于>>,因此c=(a+b-a)>>1,得到的结果是10
-
优先级 的 具体规则我们 不必记忆 . 在可能存在歧义的代码中加上括号即可