运算符

发布时间 2023-03-22 21:11:39作者: 星眼小橘

一、运算符种类

  • 算术运算符
  • 关系运算符
  • 位运算符
  • 逻辑运算符
  • 赋值运算符
  • 其他运算符

二、算术运算符

+  -  *  /  %
++,--(也叫一元运算符)
int a = 10;
int b = 3;
System.out.println("a+b="+a+b);//结果为102
//直接用+号是拼接字符串
System.out.println("a+b="+(a+b));//结果为12
//进行运算的括号拼起来
System.out.println("a-b="+a-b);//报错
//字符串只能相加拼接,不能相减
System.out.println("a-b="+a*b);//相乘运算
//乘法优先级高,所以先算乘法,在进行字符串拼接
System.out.println("a-b="+a/b);//相除运算
//除法优先级高,所以先算除法,在进行字符串拼接
double c = 3.0;
System.out.println("a/c="+a/c);//结果为3.333
//进行运算的两个数都为整型,结果也为整型,如果有一个是浮点型,结果就为浮点型
//但是会近似运算
System.out.println("a/c="+a*1.0/b);//结果为3.333
System.out.println("a/c="+a/b*1.0);//结果为3.0
//根据运算优先级,从左往右运算
System.out.println("a%b="+a%b);//结果为1
System.out.println("a%c="+a%c);//结果为1.0

下面是运行结果

需要注意

整数被 0 除将会产生一个异常, 而浮点数被 0 除将会得到无穷大或 NaN 结果。

三、关系运算符

>  <  >=  <=  ==  !=
  • ==和equals的区别
equals是判断内容是否相等,==是判断地址是否相等

四、位运算符

&:按位与,都1为1,有0为0
|:按位或,有1为1,都0为0
^:按位异或,不同为1,相同为0
~:按位非,按照8位二进制,高位是符号
  负数在计算机中以补码存储,负数的补码=反码+1
  非运算过程:取反--求反码--转原码--转十进制
<<:左位移
>>:右位移
>>>:无符号右移

五、逻辑运算符

&&:与,同真为真,有假则假
||:或,一真为真,都假为假
!:非,取反
^:异或,不同为真,相同为假。两边一样就是假,两边不一样是真
1. 短路原则:
  &&:与运算,前面假直接返回,不进行后面判断
  ||:或运算,前面真直接返回,不进行后面判断
2. 不短路情况:
  前提是两边为表达式,如果两边为数字就是位运算符
  &:不考虑前者,一定会执行后者
  |:不考虑前者,一定会执行后者

六、赋值运算符

=  +=  -=  *=  /=  %=  

<<=左移位赋值运算符

>>=右移位赋值运算符

&=按位与赋值运算符

^=按位异或赋值操作符

|=按位异或赋值操作符

  • 使用赋值运算符有一点需要注意

例如:+=,其内部自动包含了强制转换

byte x1 = 10;
byte x2 = 3;
x1 = x1 + x2;//报错,不兼容的类型,int不能转到byte
x1 += x2;//等价于a=(byte)(a+b);自动帮你强转
System.out.println("x1=" + x1);
换句话说,Java有个默认的数据类型,在运行过程中涉及到类型转换,默认都转换为默认数据类型
比如:byte类型相加,编译器认为两个byte相加,127+127大于byte的范围,就会将结果转换为int(不是short,转换为默认数据类型),所以结果就为int,就会报错。

七、其他运算符

  1. 三元运算符

补充内容
一元:自增自减和非运算
二元:两个数的运算操作(加减乘除,与或等)
表达式1 ? 表达式2 : 表达式3
int a = 10; a>5?return true:return false;

  2. instanceof 运算符

测试它左边的对象是否是它右边的类的实例,返回 boolean的数据类型。

八、优先级

算术>比较>逻辑
括号>一元>非>乘除>加减>移位
()>a++>++a>>* />+ ->>>
 
关于优先级更多的是使用括号,通常情况下不需要记住所有运算符的优先级顺序,只需记住常用的几个就可以