目录
1.算数运算符
运算符 | 作用 |
+ | 求和 |
- | 求差 |
* | 乘积 |
/ | 商 |
% | 求余 |
++ | 自加一 |
-- | 自减一 |
public class hello {
public static void main(String[] args) {
int a=2;
int b=1;
System.out.println(a+b);//3
System.out.println(a-b);//1
System.out.println(a*b);//2
System.out.println(a/b);//2
System.out.println(a%b);//0
}
}
注意:/运算符只能返回整数
++/--运算符
1.前缀版
当++出现在变量前,会
先自加一
,在做赋值运算
int x = 100;
int y = ++x;
步骤: ② ①
System.out.println(x); // 101
System.out.println(y); // 101
2.后缀版
当++出现在变量后,会
先做赋值运算
,再自加1
int m = 20;
int n = m++;
步骤: ① ②
System.out.println(n); // 20
System.out.println(m); // 21
总结:
- 可以出现在变量前,也可以出现在变量后。
- 不管出现在变量前还是后,总之++执行结束之后,变量的值一定会自加1。
2.关系运算符
运算符 | 作用 |
> | 大于 |
>= | 大等于 |
< | 小于 |
<= | 小等于 |
== | 等于 |
!= | 不等于 |
System.out.println(3>4); //false
System.out.println(3>=4);//false
System.out.println(3<4); //true
System.out.println(3<=4);//true
System.out.println(3==4); //false
System.out.println(3!=4);//true
总结:关系运算符的结果一定时布尔型:false/true
3.逻辑运算符
运算符 | 含义 | 规则 |
& | 逻辑与 | 两边都为真才为真 |
| | 逻辑或 | 一边为真即为真 |
! | 逻辑非 | !true = false、!false = true |
^ | 逻辑异或 | 相同为假,不同为真 |
&& | 短路与 | 两边为真才为真 |
|| | 短路或 | 一边为真即为真 |
System.out.println(true&false);//false
System.out.println(true|false);//true
System.out.println(!true); //false
System.out.println(true&&true);//true
System.out.println(false||false);//false
1.短路与/短路或
1.1 短路与(&&)
当左边的表达式为
false
的时候,右边的表达式不执行
//我么们先来看一下&的例子
int a=10;
int b=20;
System.out.println(a>b&++a<b);//false
System.out.println(a);//11
//可以看出最后a自加了1,说明&右边的算子执行了
//再来看一下&&的例子
int a=10;
int b=20;
System.out.println(a>b&&++a<b);//false
System.out.println(a);//10
//可以看到最后的a没有变化,说明&&右边的算子没有执行
结论:对于&&,当左边的表达式为false的时候,会产生短路,导致右边的表达式不执行
【因为&&只有两个值都为真才为真】
1.2短路或(||)
当左边的表达式结果是
true
的时候,右边的表达式不执行
//我么们先来看一下&的例子
int a=10;
int b=20;
System.out.println(a<b | ++a<b);//true
System.out.println(a);//11
//可以看出最后a自加了1,说明&右边的算子执行了
//再来看一下&&的例子
int a=10;
int b=20;
System.out.println(a<b || ++a<b);//true
System.out.println(a);//10
//可以看到最后的a没有变化,说明&&右边的算子没有执行
结论:对于||,当左边的表达式为true的时候,会产生短路,导致右边的表达式不执行
【因为||只要有一个为真即为真】
结论:逻辑运算符要求两边的算子都是布尔型,返回的结果也是布尔型【注意与位运算的区别】
4.位运算符
运算符 | 含义 | 规则 |
& | 按位与 | 两个都为1则为1 |
| | 按位或 | 一个为1即为1 |
^ | 按位异或 | 相同为0,不同为1 |
~ | 按位非(取反) | 取反 |
<< | 左移 | 左移 |
>> | 右移 | 右移 |
>>> | 无符号右移 |
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
1.左移(<<)
按照指定位数左移,左移后右端出现空位,用0补齐。保留符号位
左移运算有乘以2的N次方的效果。一个数向左移动1位,就相当于乘以2的1次方,移动两位就相当于乘以2的2次方,也就是乘以4
System.out.println(5<<2);//20
解析:5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位
补0,负数补1,等于乘于2的n次方,十进制位是5*2^2=20
2.右移(>>)
按照指定位数右移,左移后左端出现空位,用符号位上的值补充这些空位。保留符号位
右移运算有乘以-2的N次方的效果。一个数向右移动1位,就相当于乘以2的-1次方,移动两位就相当于乘以2的-2次方,也就是乘以四分之一
System.out.println(20>>2);//5
解析:20的二进制位是0001 0100, 就是把有效值10100往左挪两位就是0000 0101,正数左边第一位
补0,负数补1,等于乘于2的n次方,十进制位是20*2的-2次方=5
3.无符号右移(>>>)
按照指定位数右移,左端出现的空位用0补齐,这就意味着,他与有符号右移的区别在负值上的移动,因为正值符号位也是0
int a=20;
//正数
System.out.println(a>>2);//5
System.out.println(a>>>2);//5
//复数
System.out.println(-a>>2);//-5
System.out.println(-a>>>2);//1073741819
可以看出无符号右移与有符号右移只有在负数上的差异
System.out.println(a);//20
注意:位移运算不会改变原来变量的值
结论:
- 位运算符是对long、int、short、byte和char这5种类型的数据进行运算的,我们不能对double、float和boolean进行位运算操作。
- 移位运算不会改变原来变量的值
5.赋值运算符
运算符 | 含义 | 示例 |
= | 赋值 | a=12 |
+= | 加等 | a+=b => a=a+b |
-= | 减等 | a-=b => a=a-b |
*= | 乘等 | a*=b => a=a*b |
/= | 除等 | a/=b => a=a/b |
%= | 横等 | a%=b => a=a%b |
6.三目运算符
布尔表达式 ? 表达式1 : 表达式2
原理:布尔表达式的结果为true
时,表达式1
的执行结果作为整个表达式的结果。
布尔表达式的结果为false
时,表达式2
的执行结果作为整个表达式的结果。
char a=1>0?'男':'女';
char b=1<0?'男':'女';
System.out.println(a);//男
System.out.println(b);//女
7.字符串连接运算符(+)
拼接两个字符串
1.+ 运算符在java语言中有两个作用。
- 求和
- 拼接字符串
2.什么时候求和?什么时候进行字符串的拼接呢?
- 当 + 运算符两边都是数字类型的时候,求和。
- 当 + 运算符两边的任意类型是字符串类型时,那么这个+会进行字符串拼接操作。
int a=123;
int b=456;
System.out.println(a+b);//579
String c="abc";
String d="def";
System.out.println(c+d);//abcdef
结论:字符串拼接完之后的结果还是一个字符串。
8.Java运算符的优先级
最后总结一下运算符的优先级