运算符

算术运算符

1、+

(1)左、右都为数值型,则做加法运算

(2)左、右其中一方为字符串,则做拼接运算

(3)运算顺序从左至右

(4)char 类型在运算时,转换成对应码值

2、-

(1)负号

(2)减法运算

3、*

(1)乘法运算

4、/

(1)除法运算

System.out.println(10 / 4);//2
System.out.println(10.0 / 4);//2.5
double d1 = 10 / 4;//2.0
System.out.println(d1);

5、%

(1)取模 / 取余

(2)本质:a % b = a - a / b * b

System.out.println(10 % 3);//1
System.out.println(-10 % 3);//-1
System.out.println(10 % -3);//1
System.out.println(-10 % -3);//-1

6、++ / --

(1)自增 / 自减

(2)作为独立语句使用:i++ <=> ++i,i-- <=> --i

(3)作为表达式使用:i++:先执行后自增,++i:先自增后执行;i--:先执行后自减,--i:先自减后执行

(4)强制转换为表达式中最高类型:i++ <=> i = i + 1;i-- <=> i = i - 1

(5)强制转换为原类型:++i <=> i += 1 <=> i = (i.Type)(i + 1);--i <=> i -= 1 <=> i = (i.Type)(i - 1)

 

关系运算符

1、结果都为 boolean 类型

2、“==”是关系运算符,“=”是赋值

关系运算符 含义 结果
== 相等于 1 == 2 false
!= 不等于 1 != 2 true
< 小于 1 < 2 true
> 大于 1 > 2 false
<= 小于等于 1 <= 2 true
>= 大于等于 1 >= 2 false
instanceof 检查是否为类的对象 "abc" instanceof String true

 

逻辑运算符

1、&&(短路与):条件 1 && 条件 2,若条件 1 为 false,则不会判断条件 2 ,效率高

2、&(逻辑与):条件 1、条件 2 都会判断,效率低

3、||(短路或):条件 1 || 条件 2,若条件 1 为 true,则不会判断条件 2 ,效率高

4、|(逻辑或):条件 1、条件 2 都会判断,效率低

5、!(取反):!条件,条件为 true,取反后为 false;条件为 false,取反后为true

6、^(逻辑异或):条件 1 ^ 条件 2,条件 1、条件 2 相同时,结果为 false;条件 1、条件 2 不同时,结果为 true

条件 运算结果
a b a & b a && b a | b a || b !a a ^ b
true true true true true true false false
true false false false true true false true
false true false false true true true true
false false false false false false true false

 

赋值运算符

1、基本赋值运算符:=

2、复合赋值运算符:+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、|=

3、特点

(1)运算顺序从右往左

(2)赋值运算符左方只能为变量,右方可以是变量、表达式、常量值

(3)复合赋值运算符会强制转换类型

byte b1 = 3;
b1 += 3;//等价于 b = (byte)(b + 3)
byte b2 = 3;
b2 = b2 + 3;//错误,b为byte,3为int,(b + 3)自动转换为int,而int不能赋值给byte

 

三元运算符

1、基本语法:条件表达式 ? 表达式1 : 表达式2;

2、运算规则

(1)条件表达式为 true,返回表达式 1

(2)条件表达式为 false,返回表达式 2

3、事项

(1)若表达式 1、表达式 2 是可以赋给接收变量的类型,则表达式可以自动转换类型或强制转换类型

int a = 1;
int b = 2;
int c = a > b ? (int) 3.5 : (int) 4.5;//强制转换类型
double d = a > b ? a : b;//自动转换类型

(2)三元运算符可以转换为 if else 语句

(3)三元运算符是一个整体,相当于完整表达式,先自动转换类型到最高精度,再判断运算

(4)三元运算符可以嵌套三元运算符,运算顺序从左往右,结合顺序从右往左

4、转换规则

(1)若两个操作数不可转换,则不做转换,返回值为 Object 类型

(2)若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int 类型转换为 long 类型,long 类型转换为 float 类型等

(3)若两个操作数中有一个是数字 S,另外一个是表达式,且其类型标示为 T,那么,若数字 S 在 T 的范围内,则转换为 T 类型;若 S 超出了 T 类型的范围,则 T 转换为 S 类型

(4)若两个操作数都是直接量数字,则返回值类型为范围较大者

5、以下两种场景会触发类型对齐的拆箱操作

(1)表达式 1 或表达式 2 的值只有一个是原始类型

(2)表达式 1 或表达式 2 的值的类型不一致,会强制拆箱升级成表示范围更大的那个类型

6、表达式 1 和 表达式 2 在类型对齐时,可能抛出因自动拆箱导致 NullPointerException

7、布尔条件表达式

(1)如果第二个和第三个操作数都是 Boolean,那么条件表达式就是 Boolean

(2)否则,条件表达式的类型为 boolean

8、数字条件表达式

(1)如果第二个和第三个操作数的类型相同,那么这就是条件表达式的类型

(2)如果第二个和第三个操作数中的一个是原始类型 T,而另一个操作数的类型是对 T 进行装箱转换的结果,那么条件表达式的类型就是 T

(3)如果操作数之一是 byte 或 Byte,而另一个操作数是 short 或 Short,那么条件表达式的类型就是 short

(4)如果操作数之一是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式,其值可以用 T 类型表示,那么条件表达式的类型是 T

(5)如果操作数之一是 T 类型,其中 T 是 Byte、Short 或 Character,而另一个操作数是 int 类型的常量表达式,其值可以用类型 U 来表示,而类型 U 是对 T 进行开箱转换的结果,那么条件表达式的类型是 U

(6)否则,将对操作数类型进行二进制数值提升(自动类型转换),条件表达式的类型就是第二和第三个操作数的提升类型

(7)注意,二进制数值提升(自动类型转换)执行值集转换(value set conversion),并可能执行拆箱转换

9、引用条件表达式(独立引用条件表达式)

(1)如果第二个和第三个操作数的类型相同(可能是 null),那么这就是条件表达式的类型

(2)如果第二操作数和第三操作数之一的类型是 null,而另一个操作数的类型是引用类型,那么条件表达式的类型就是该引用类型

(3)否则,第二和第三个操作数分别是 S1 和 S2 类型。假设 T1 是对 S1 进行装箱转换后的类型,T2 是对 S2 进行装箱转换后的类型。条件表达式的类型就是对 lub(T1, T2) 进行捕获转换后的结果(即返回最小相同父类)

 

位运算符

1、&(按位与):两位全为 1,运算结果为 1,否则为 0

2、|(按位或):两位其中为 1,运算结果为 1,否则为 0

3、^(按位异或):两位一个为 1,另一个为 0,运算结果为 1,否则为 0

4、~(按位取反):0 变 1,1 变 0

byte b1 = 2;
byte b2 = 3;
byte b3 = -2;
System.out.println(b1 & b2);
/*
2的原码、补码:00000010
3的原码、补码:00000011
按位与&运算后
运算结果的补码、原码:00000010
二进制原码转为十进制:2
*/
System.out.println(~b3);
/*
-2的原码:10000010
-2的反码:11111101
-2的补码:11111110
按位取反~运算后
结果的补码、原码:00000001
二进制原码转十进制:1
*/

5、>>(算术右移):低位溢出,符号位不变,符号位缺失的高位

(1)a >> b 本质:a / 2b

6、<<(算术左移):高位溢出,符号位不变,0 补缺失的低位

(1)a << b 本质:a * 2b

7、>>>(逻辑右移 / 无符号右移):低位溢出,0 补缺失的高位

(1)没有 <<< 符号

 

运算符优先级

从高到低,优先级减小     .   ()   {}   ;   ,
从右向左运算 单目运算符 ++   --   ~   !
从左到右运算 算术运算符 *   /   %
+   -
位移运算符 <<   >>   >>>
比较运算符 <   >   <=   >=   instanceof
==   !=
逻辑运算符 &
^
|
&&
||
三元运算符 ?   :
从右到左运算 赋值运算符 =   *=   /=   %=
+=   -=   <<=   >>=
>>>=   &=   ^=   |=
posted @   半条咸鱼  阅读(153)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示