运算符
运算符:是一种特殊的符号,用以表示数据的运算、赋值和比较等。
表达式:用运算符连接起来的式子
在Java中,一共有38个运算符。
一、运算符的分类
- 按照功能划分:
分类 | 运算符 |
---|---|
算术运算符 | + 、- 、* 、/ 、% 、++ 、-- |
赋值运算符 | = 、+= 、-= 、*= 、/= 、%= 等 |
关系运算符 | > 、>= 、< 、<= 、== 、!= |
逻辑运算符 | & 、` |
条件运算符 | (条件表达式)?结果1:结果2; |
位运算符(了解) | & 、` |
- 按照操作数个数划分:
分类 | 运算符 | 例子 |
---|---|---|
一元(单目)运算符 | ++、–、! | i++、–i |
二元(双目)运算符 | +、-、*、/、%、>、<=等 | a+b、10>=9 |
三元(三目)运算符 | 表达式1?表达式2:表达式3 | age>=18?“成年”:“未成年” |
二、算术运算符
算术运算符 | 符号解释 |
---|---|
+ | 加法运算,字符串连接运算,正号 |
- | 减法运算,负号 |
* | 乘法运算 |
/ | 除法运算,整数/整数结果还是整数 |
% | 求余运算,余数的符号只看被除数 |
++ 、 -- | 自增自减运算 |
System.out.println(5%2);//1
System.out.println(5%-2);//1
System.out.println(-5%2);//-1
System.out.println(-5%-2);//-1
//商除数 + 余数 = 被除数
//5%-2 ==>商是-2,余数是1 (-2)(-2)+1 = 5
//-5%2 ==>商是-2,余数是-1 (-2)*2+(-1) = -4-1=-5
“+”号的两种用法
-
第一种:对于
+
两边都是数值的话,+
就是加法的意思 -
第二种:对于
+
两边至少有一边是字符串得话,+
就是拼接的意思
自加自减运算
理解:++
运算,变量自己的值加1。反之,--
运算,变量自己的值减少1,用法与++
一致。
-
单独使用
-
变量在单独运算的时候,变量
前++
和变量后++
,变量的是一样的; -
变量
前++
:例如++a
。 -
变量
后++
:例如a++
。
-
-
复合使用
- 和
其他变量放在一起使用
或者和输出语句放在一起使用
,前++
和后++
就产生了不同。 - 变量
前++
:变量先自身加1,然后再取值。 - 变量
后++
:变量先取值,然后再自身加1。
- 和
小结:
- ++在前,先自加,后使用;
- ++在后,先使用,后自加。
public static void main(String[] args){
int i = 1;
int j = i++;
int k = i++ * ++j + --i * j–;
System.out.println("i = " + i);//2
System.out.println("j = " + j);//1
System.out.println("k = " + k);//8
}
三、赋值运算符
注意:所有的赋值运算符的=左边一定是一个变量
赋值运算符 | 符号解释 |
---|---|
= | 将符号右边的值,赋值给左边的变量 |
+= | 将符号**左边的值 和右边的值 进行相加操作,最后将结果赋值给左边的变量 ** |
-= | 将符号**左边的值 和右边的值 进行相减操作,最后将结果赋值给左边的变量 ** |
*= | 将符号**左边的值 和右边的值 进行相乘操作,最后将结果赋值给左边的变量 ** |
/= | 将符号**左边的值 和右边的值 进行相除操作,最后将结果赋值给左边的变量 ** |
%= | 将符号**左边的值 和右边的值 进行取余操作,最后将结果赋值给左边的变量 ** |
扩展赋值运算符
short s = 3;
// s = s + 4; 代码编译报错,因为将int类型的结果赋值给short类型的变量s时,可能损失精度
s += 4; // 代码没有报错
//因为在得到int类型的结果后,JVM自动完成一步强制类型转换,将int类型强转成short
System.out.println(s);
int j = 1;
j += ++j * j++;//相当于 j = j + (++j * j++);
System.out.println(j);//5
扩展赋值运算符在将最后的结果赋值给左边的变量前,都做了一步强制类型转换。
四、关系运算符/比较运算符
比较运算符,是两个数据之间进行比较的运算,运算结果一定是boolean值true
或者false
。
关系运算符 | 符号解释 |
---|---|
< | 比较符号左边的数据是否小于右边的数据,如果小于结果是true。 |
> | 比较符号左边的数据是否大于右边的数据,如果大于结果是true。 |
<= | 比较符号左边的数据是否小于或者等于右边的数据,如果大于结果是false。 |
>= | 比较符号左边的数据是否大于或者等于右边的数据,如果小于结果是false。 |
== | 比较符号两边数据是否相等,相等结果是true。 |
!= | 不等于符号 ,如果符号两边的数据不相等,结果是true。 |
五、逻辑运算符
逻辑运算符,是用来连接两个布尔类型结果的运算符(!
除外),运算结果一定是boolean值true
或者false
逻辑运算符 | 符号解释 | 符号特点 |
---|---|---|
& | 与,且 | 有false 则false |
` | 或 | 有true 则true |
^ | 异或 | 相同为false ,不同为true |
! | 非 | 非false 则true ,非true 则false |
&& | 双与,短路与 | 左边为false,则右边就不看 |
`` | 双或,短路或 | 左边为true,则右边就不看 |
&&和&区别,||和|区别
短路与,短路或运算符左边表达式结果可以确定最终结果,则运算符右边表达式不再进行运算,效率高
-
**
&&
和&
**区别:&&
和&
结果一样,&&
有短路效果,左边为false,右边不执行;&
左边无论是什么,右边都会执行。 -
**
||
和|
**区别:||
和|
结果一样,||
有短路效果,左边为true,右边不执行;|
左边无论是什么,右边都会执行。
int x = 1;
int y = 1;
//x==2 ,x++ false x = 2 左边为false
//右边继续
//++y y==2 y=2 y==2成立 右边为true
//false & true 结果false
if(x++==2 & ++y==2){
x =7;
}
System.out.println("x="+x+",y="+y);
//x=2,y=2
int x = 1,y = 1;
//x==1,x++ 左边为true,x=2
//因为是逻辑与,右边继续
//++y, y==1 y=2 右边为false
//条件true | false,最终为true
if(x++==1 | ++y==1){
x =7;
}
System.out.println("x="+x+",y="+y);//x=7,y=2
面试题:
boolean x = true;
boolean y = false;
short z = 42;
//如果if((z++==42)&&(y==true))条件成立,执行z++,不成立,就不执行z++
//左边的条件:z==42,z++ z==42成立,z++变成43
//中间虽然是短路与,因为左边现在是true,右边还要看
//右边 y==true 不成立
//true && false 结果为false
if((z++==42)&&(y==true)) z++;
//左边为x=false,赋值 结果就为false
//中间虽然为短路或,因为左边是false,右边继续看
//++z,z==45 ++z变成44,z==45是否成立,不成立
//false || false 结果为false
if((x=false) || (++z==45)) z++;
System. out.println("z="+z);//44
六、条件运算符
条件运算符格式:
条件表达式?结果1:结果2
条件运算符计算方式:
- 条件判断的结果是true,条件运算符整体结果为结果1,赋值给变量。
- 判断条件的结果是false,条件运算符整体结果为结果2,赋值给变量。
int i = (1==2 ? 100.0 : 200);
System.out.println(i);//200.0
当两个不同的数据类型作为结果时自动转为较大的那个数据类型
七、 位运算符
位运算符 | 符号解释 |
---|---|
& | 按位与,当两位相同时为1时才返回1 |
` | ` |
~ | 按位非,将操作数的每个位(包括符号位)全部取反 |
^ | 按位异或。当两位相同时返回0,不同时返回1 |
<< | 左移运算符 |
>> | 右移运算符 |
>>> | 无符号右移运算符 |
- 位运算符的运算过程都是基于补码运算,但是看结果,我们得换成原码,再换成十进制看结果
- 从二进制到十进制都是基于原码
- byte,short,char在计算时按照int类型处理
- 位运算直接对二进制进行位移操作实现数值运算,所以运算效率高
-
左移:<<
运算规则:左移几位就相当于乘以2的几次方注意:当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位
byte,short,char在计算时按照int类型处理
-3<<4 类似于 -32的4次= -316 = -48
- 右移:>>
快速运算:类似于除以2的n次幂,如果不能整除,向下取整
-69>>4 类似于 -69/2的4次 = -69/16 = -5
-
无符号右移:>>>
运算规则:往右移动后,左边空出来的位直接补0,不看符号位正数:和右移一样
负数:右边移出去几位,左边补几个0,结果变为正数
69>>>4 类似于 69/2的4次 = 69/16 =4
-69>>>4 结果:268435451
- 按位与:&
运算规则:对应位都是1才为1
1 & 1 结果为1
1 & 0 结果为0
0 & 1 结果为0
0 & 0 结果为0
-9&7 = 7
- 按位或:|
运算规则:对应位只要有1即为1
1 | 1 结果为1
1 | 0 结果为1
0 | 1 结果为1
0 | 0 结果为0
-9|7 结果: -9
- 按位异或:^
运算规则:对应位一个为1一个为0,才为1
1 ^ 1 结果为0
0 ^ 1 结果为1
0 ^ 0 结果为0
-9^7 结果为-16
- 按位取反
运算规则:
~0就是1
~1就是0
~-9 结果:8
八、 运算符优先级
提示说明:
(1)表达式不要太复杂
(2)先算的使用()
大体的排序:算术 > 位 > 比较 > 逻辑 > 三元 > 赋值