0
点赞
收藏
分享

微信扫一扫

Java笔记(三)

雷亚荣 2022-05-01 阅读 27

运算符

三、运算符

(一)什么是运算符

计算机的最基本的用途之一就是执行数学运算

运算符:对操作数进行操作时的符号

表达式:运算符和操作数结合

(二).算术运算符

(1)基本四则运算

A.取整、算数异常

补:5/0等于几?

答:除数不能为0 会报错

异常:程序运行的时候出现的不正常的行为

在JAVA当中,异常的种类有很多种,要做的看到异常就大概知道是啥问题

举例:

当5/0时:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mZ5M0twG-1651391737042)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220501104244768.png)]

指在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

​ 两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

​ 如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9i1eifKW-1651391737044)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220501123242227.png)]

​ 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。

注意:运算符之间是有优先级的. 具体的规则我们不必记忆. 在可能存在歧义的代码中加上括号即可.

举报

相关推荐

0 条评论