一、基本概念
1、介绍:
表达式由操作数与操作符组成,操作数可以是一个常量、变量或表达式,操作符用于指明操作数的操作方式。
比如:1 + 2,1 > 2 && true。
2、优先级:
优先级 | 操作符 | 简介 | 结合性 |
---|---|---|---|
1 | [ ] 、. 、( ) | 方法调用,属性获取 | 从左向右 |
2 | !、~、 ++、 – | 一元运算符 | 从右向左 |
3 | * 、/ 、% | 乘、除、取模(余数) | 从左向右 |
4 | + 、 - | 加减法 | 从左向右 |
5 | <<、 >>、 >>> | 左位移、右位移、无符号右移 | 从左向右 |
6 | < 、<= 、>、 >=、 instanceof | 小于、小于等于、大于、大于等于, 对象类型判断是否属于同类型 | 从左向右 |
7 | == 、!= | 是否相等,是否不等于。 | 从左向右 |
8 | & | 按位与 | 从左向右 |
9 | ^ | 按位异或 | 从左向右 |
10 | | | 按位或 | 从左向右 |
11 | && | 短路与 | 从左向右 |
12 | || | 短路或 | 从左向右 |
13 | ?: | 条件运算符 | 从右向左 |
14 | =、 += 、-= 、*= 、/=、 %=、 &=、 |=、 ^=、 <、<= 、>、>= 、>>= | 混合赋值运算符 | 从右向左 |
参考:https://www.sojson.com/operation/java.html
那么多似乎有点记不住,那么为表达式加括号()
吧。
二、操作符分类
1、按作用的操作数个数分类:
一元操作符:操作的操作数为一个,比如:++、- -
二元操作符:操作的操作数为两个,比如:+、-、*、/
三元操作符:操作的操作数为三个,比如:三元表达式 int i = (2 > 1 ? 2 : 1)
2、具体功能分:
算数操作符:+、-、*、%、/、++、- -
逻辑操作符:&&、||
比较操作符:>、<、<=、>=。。。
按位操作符:&、| 、^、~
移位操作符:>>、<<、<<<
三元操作符:布尔表达式?表达式1:表达式2
三、操作符介绍
注意:对于byte、short、char在运算时会转换为int
1、算数操作符
+、-、*、/、%、++、- -
注意:
(1)、除了boolean,其他基本数据类型都可以进行这些操作。
(2)、除了++、- -外,其他算数操作符可以配置 =
使用。
2、逻辑操作符
&&、||
注意:
(1)、左右两边均为布尔表达式。
(2)、会发生短路现象,即一旦通过判断左边的表达式,可以确定整个表达式,那么操作符右边的表达式就不会进行判断。
@Test
public void test1(){
int i = 0;
if(false && i++ > 0){
//左侧表达式为false,&&操作,通过左侧已经可以判断整个表达式
}
System.out.println(i); //0
--------------------------------------------
int j = 0;
if(true || j++ > 0){
//左侧表达式为true, ||操作, 通过左侧已经可以判断整个表达式
}
System.out.println(j); //0
}
3、比较操作符
== 、 > 、>= 、< 、<= 、 !=
4、赋值操作符
=、+= 、-= 、 *= 、/= 、%= 、&= 、^= 、 |=
@Test
public void test2(){
int i = 0;
i += 1; //等价于 i = i + 1;
System.out.println(i);
//其他的类似
}
5、按位操作符
& 、 | 、 ^ (异或) 、~(取反)
介绍:
以上的操作符为位运算操作符,左右两侧可以是整数、字母、或者boolean表达式
@Test
public void test3(){
System.out.println(~'a'); //-98
System.out.println(3 ^ 2); //1
System.out.println(true ^ false); //true
}
~:即按位取相反数
比如:字符a
对应数字97,二进制为0000000000000000000000000001100001,~操作后为11111111111111111111111110011110,互补后(-(取反 + 1))即为-98
^:即相异1,相同为0(相异为true,相同为false)
比如:3^2,二进制为…0011 ^ …0010,异或操作后为…0001,即为1,负数也是类似的。
注意:
(1)、&、| 并没有短路现象,左右两边均会判断。
(2)、除 ~ 外,其他都可以配合 = 使用。
(3)、boolean表达式可以配合按位操作符使用,~除外(为了区别 !
)。
@Test
public void test4(){
System.out.println(~(2 > 1)); //报错
int i = 0;
System.out.println(i ^= 1);
System.out.println(i &= 1);
System.out.println(i |= 1);
System.out.println(i ~= 1); //报错
}
6、移位操作符
<<(左移)、>>(右移)、>>>(无符号右移)
介绍:
<<(左移):即数字带符号向左移位,左边高位丢弃,右边低位补0。
>>(右移):即数字带符号右移,被移位的二进制最高位是0(即+),右移后,空缺位补0,最高位为1(即-),右移后,空缺位补1。
>>>(无符号右移):被移位的最高位无论是否是0或1,空缺位都用0补
。
说明:位数不够的,是由于前面的0省略掉了。比如:11 -》000000000000000000000000000000011
@Test
public void test1(){
//<<
System.out.println(Integer.toBinaryString(3)); //11
System.out.println(Integer.toBinaryString(3<<1)); //110
System.out.println(Integer.toBinaryString(-3));//11111111111111111111111111111101
System.out.println(Integer.toBinaryString(-3<<1));//11111111111111111111111111111010
//>>
System.out.println(Integer.toBinaryString(3)); //11
System.out.println(Integer.toBinaryString(3>>1)); //1
System.out.println(Integer.toBinaryString(-3));//11111111111111111111111111111101
System.out.println(Integer.toBinaryString(-3>>1));//11111111111111111111111111111110
//>>>
System.out.println(Integer.toBinaryString(3)); //11
System.out.println(Integer.toBinaryString(3>>>1)); //1
System.out.println(Integer.toBinaryString(-3));//11111111111111111111111111111101
System.out.println(Integer.toBinaryString(-3>>>1));//01111111111111111111111111111110
}
7、三元操作符
boolean表达式 ? 表达式1:表达式2;
示例:
@Test
public void test1(){
int i = 2 > 1 ? 2 : 1;
}