运算符
三、运算符
(一)什么是运算符
计算机的最基本的用途之一就是执行数学运算
运算符:对操作数进行操作时的符号
表达式:运算符和操作数结合
(二).算术运算符
(1)基本四则运算
A.取整、算数异常
补:5/0等于几?
答:除数不能为0 会报错
异常:程序运行的时候出现的不正常的行为
在JAVA当中,异常的种类有很多种,要做的看到异常就大概知道是啥问题
举例:
当5/0时:
指在main函数中
ArithmeticException: 算数异常
/ by zero :除0了
at TestDemo.main(TestDemo.java:5) :在TestDemo类中的main方法(在TestDemo文件的第10行)
常见异常:空指针异常、数组越界异常、不支持克隆异常
补充:
float h =0;
System.out.println(1/h);
结果:Infinity(无穷)
解释:所以浮点型数值的计算都遵循IEEE 745规范。具体来说,下面是用来表示溢出和出错情况的三个特殊的浮点数值:
正无穷大
负无穷大
NaN(不是一个数字)
例如,一个正整数除以0的结果为正无穷大,计算0/0或者负数的平方根结果为NaN
B.取余
a.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cz9fvKxf-1651391737043)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220501120422557.png)]
就是简单的正负除法
b.
11.5%2 ----》1.5 (在Java中可以对小数进行取余)
(2)增量运算符
+=、*= 。。。。。。
short s1 = 10;
//s1 = s1+1; //报错 相加后为整形
//s1 = (short)(s1+1);//不报错了
s1 +=1; //也不报错
System.out.pintln(s1)
增量运算符可以帮我们进行增量运算符
(3)自增自减运算符
与C一样
(三)关系运算符
==、>=、<=、!= 所有的操作数和关系运算符结合后最终结果只有true和false 两个值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utQjcErU-1651391737043)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220501122244763.png)]
黄色是警告,不是错误,不影响运行,警告仅供参考
注:3<a<5不允许这样表示
(四)逻辑运算符
1、&& 并且 逻辑与
(1)布尔表达式1 && 布尔表达式2
两个表达式都为真,结果才是真,只要有一个是假,结果就是假。
如:
1 && 2 --》报错:两侧都不是布尔表达式
true && false – 》正常运行
(2)&&也被称为短路与 如果表达式1为假,则表达式2就不执行了
如:
public static void main10(String[] args) {
int a = 1;
int b = 2;
System.out.println((a > b) && (19/0 == 0));
}
a>b为假 那么19/0==0不执行了,所以运行的时候也不会报错
2、|| 逻辑或
(1)布尔表达式1 || 布尔表达式2
有一个为真,即为真
(2)短路或
只要表达式1为真,就不执行表达式2
3、!逻辑非
!布尔表达式
int a = 1;
//System.out println(!a);//报错:a并不是布尔表达式
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true
(五)位运算符
Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位. 字节是最小的存储单位,每个字节是由8个二 进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。 位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位 的每一位依次进行计算.
&:按位与
^:按位异或
|:按位或
~:按位取反
举例:
0101
0110 &
0100 结果 所以 &:只有对应位都是1,结果才是1
0101
0011 |
0111 结果 所以 |:只要对应位有1,结果才是1
0101 -》 1010(按位取反后)
所以 ~:把0变成1;把1变成0
0101
0110 ^
0011 结果 所以 ^:找不一样的位,只要对应位不一样结果就为1
注意:
0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.
0xf 表示 10 进制的 15, 也就是二进制的 1111
printf 能够格式化输出内容, %x 表示按照十六进制输出.
(六)移位运算符
移位运算符有三个: <<、 >> 、>>> ,都是二元运算符,且都是按照二进制比特位来运算的。
1、左移<<(左边丢弃,右边补0)
11: 000 1011(二进制)(其实应该是32位这里简写了)
11<<1(左移一位) =》0000 1011 都向左移一位,则最左面的那个没了 剩下000 1011 少了一位 所以我们在其右边补上一位 得0001 0110 =》22 =》11*2^1
11<<2 =》0000 1011左移两位 00 1011 补上 0010 1100 =》44 =》11*2^2
所以:对于正数来说,左移相当于乘法
2、右移>>
11>>1(右移一位) =》0000 1011 都向右移一位,则最右面的那个没了 剩下0000 101 少了一位 所以我们在其右边补上一位 (补什么呢?要看符号位:如果符号位为0,则补0;如果符号位为1,则补1.)0000 101符号位为0(正数符号位为0) 所以补上0 =》0000 0101 =》5 11/2^1
11>>2 =》0000 10 都向右移两位 用符号位的数补位=》0000 0010=》2 11/2^2
所以:对于正数来说,右移相当于除法
-1:原码:1000 0001 反码:1111 1110 补码:1111 1111(负数是对补码进行处理)>>1111 1111 =》-1
3、无符号右移>>>
1111 1111>>>1 =》1111 111 通通补0 =》0111 1111
不管符号位,通通补0
补:二进制存储的是补码
注意: 1. (正数)左移 1 位, 相当于原数字 * 2, 左移 N 位, 相当于原数字 * 2 的N次方.
2.(正数)右移 1 位, 相当于原数字 / 2.,右移 N 位, 相当于原数字 / 2 的N次方.
3.由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
<u>4. 移动负数位或者移位位数过大都没有意义.</u>
5. 移动32次直接成0
(七)条件运算符
条件运算符只有一个:
布尔表达式1 ? 表达式2 : 表达式3
当 布尔表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值;
当 布尔表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.
也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
注意:
1.表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换(自动转换)
nt a = 10;
int b = 20;
int c = a > b? 1 : 2.0;//报错
System.out.println(true?1:2.0);//不报错,隐式类型转换,会将1提升为1.0
2.表达式不能单独存在,其产生的结果必须要被使用。
int a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句
补充:
boolean flg = false ? false:true == true?true:false
问:结果是啥?是true
分析:
先分为三部分 false、false、true == true ? true :false
因为是false 所以执行true == true ? true :false
又是一个条件运算
因为true==true
成立,所以结果为true
(八)运算符优先级
+的优先级要高于 >>
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);
分析:上述表达式中,由于 + 的优先级要高于 >> , 因此a先和b-a的结果做加法,整体为20,最后再进行右移,因此结果 为10。
注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.