【Java学习】多种运算符

目录

一、算术运算符

1.基本四则运算符(+ - * / %)

【1】除(/)

【2】模(%)

【3】类型提升

【4】小贴士

2.增量运算符(+= -= *= %=)

3.自增/自减运算符(++ --)

二、关系运算符

三、逻辑运算符

1、逻辑与(&&)

2、逻辑或(||)

3、逻辑非(!)

4、短路求值

四、位运算符

1、按位与(&)

2、按位或(|)

3、按位取反(~)

4、按位异或(^)

五、移位运算

1、左移(<<)

​编辑

2、右移(>>)

​编辑

3、无符号右移(>>>)

4、小贴士

六、条件运算符

七、运算符的优先级


一、算术运算符

1.基本四则运算符(+ - * / %)

基本四则运算符其实就是最简单的加减乘除模

int a = 20;
int b = 10;
System.out.println(a + b); // 30
System.out.println(a - b); // 10
System.out.println(a * b); // 200
System.out.println(a / b); // 2
System.out.println(a % b); // 0 --->模运算相当于数学中除法的余数

【1】除(/)

在除法操作时,右操作数不能为0

int a = 1;
int b = 0;
System.out.println(a / b)
// 运行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test.main(Test.java:5)

浮点数的除法运算需采用浮点类型进行运算

int a = 3;
int b = 2;
// 在数学中应该是1.5 但是在Java中输出结果为1 会向下取整,即小数点之后全部舍弃掉了
System.out.println(a / b);
// 如果要得到数学中的结果,可以使用如下方式

/*
方式一:让变量 a 乘 1.0,使得a由int类型提升为double类型
       然后除以b,结果为double类型 再用double类型的变量d接收 
*/
double d = a * 1.0 / b;
System.out.println(d);

/*
方式二:直接将变量a强制类型转化为double,然后除以b,
       结果为double类型 再用double类型的变量d接收
*/
double d = (double)a / b
System.out.println(d);

【2】模(%)

大家最不熟悉的应该就是模,实际上模运算就相当于数学中除法的余数 

int a = 20;
int b = 3;
//这里取模 其实也就是 20/3 的余数
System.out.println(a % b); //结果为2
        
int c = 2;
//这里取模 其实也就是 20/2 的余数
System.out.println(a % c); //结果为0

在取模操作时,右操作数不能为0

int a = 1;
int b = 0;
System.out.println(a % b)
// 运行结果
Exception in thread "main" java.lang.ArithmeticException: % by zero
at Test.main(Test.java:5)

当然,取模操作也可以对double类型数据使用,但是没有什么意义,一般是对int类型数据取模

double a = 11.5;
double b = 2.0;
System.out.println(a % b); //结果为1.5

【3】类型提升

两侧操作数类型不一致时,类型小的向类型大的提升
// +的左侧是int,右侧是double,在加之前int被提升为double
System.out.println(1+0.2);
// 故:输出1.2

【4】小贴士

  1. 基本四则运算符都是二元运算符,使用时必须要有左右两个操作数
  2. int类型数据 除以 int类型数据 还是int类型数据,并且会向下取整,自动舍去小数

2.增量运算符(+= -= *= %=)

该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
int a = 6;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出8

a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出5

a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出18

a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2

3.自增/自减运算符(++ --)

++ 是给变量的值 +1 -- 是给变量的值 -1
++、-- 的前置和后置功能不同,需要理清它们的关系
int a = 1;

// 后置++ 表示给a的值加1,此时a的值为2
a++;
// 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
System.out.println(a++); // 输出2
System.out.println(a); // 输出3

// 注意:此时a的值为3
// 前置++ 表示给a的值加1
++a;
 // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
System.out.println(++a); //输出5
System.out.println(a); // 输出5

// --操作符给操作-1,与++含义类似

PS:

  1. 如果单独使用,【前置++】和【后置++】没有任何区别
  2. 如果混合使用,【前置++】先+1,然后使用变量+1后的值,【后置++】先使用变量原来的值,表达式结束时给变量+1
  3. 只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改

二、关系运算符

关系运算符主要有六个 : == != < > <= >= ,其计算结果是 true 或者 false
int a = 10;
int b = 20;
// 注意:在Java中 = 表示赋值,要与数学中的含义区分
// 在Java中 == 表示相等
// eg:if(a == b) 这里的表示 a是否等于b ==表示相等
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false

PS:进行多次判断时不能连在一起,必须分开!

错误写法:1<a<4 Java和数学中是有部分区别的

三、逻辑运算符

逻辑运算符主要有三个 : && || ! ,运算结果都是 boolean 类型。

1、逻辑与(&&)

简单来讲,逻辑与(&&)其实就可以直接理解成"并且"

语法规则:表达式1 && 表达式2 其中左右表达式必须是boolean的结果

eg:进入我们社团的同学必须成绩十分优异并且三观正

上述例子中,表达式1:成绩十分优异 表达式2:三观正

那么我们要想加入社团就必须同时满足两个条件

也就是让表达式1为true,并且表达式2也为true才行

也就是说逻辑与(&&):两个表达式都为真,结果才是真,只要有一个是假,结果就是假。

int a = 1;
int b = 2;
// 左为真 且 右为真 则结果为真
System.out.println(a == 1 && b == 2);
// 左为真 但 右为假 则结果为假
System.out.println(a == 1 && b > 100);
// 左为假 但 右为真 则结果为假
System.out.println(a > 100 && b == 2);
// 左为假 且 右为假 则结果为假
System.out.println(a > 100 && b > 100);

2、逻辑或(||)

简单来讲,逻辑或(||)其实就可以直接理解成"或者"

语法规则:表达式1 || 表达式2 其中左右表达式必须是boolean的结果

eg:进入我们社团的同学高考语文必须120分以上或者高考数学130分以上

上述例子中,表达式1:高考语文成绩必须120分以上 表达式2:高考数学130分以上

那么我们要想加入社团仅仅满足一个条件就可以了

也就是让表达式1为true或者让表达式2为true

也就是说逻辑或(||):左右表达式至少有一个位真,则结果为真

int a = 1;
int b = 2;
// 左为真 且 右为真 则结果为真
System.out.println(a == 1 || b == 2);
// 左为真 但 右为假 则结果也为真
System.out.println(a == 1 || b > 100);
// 左为假 但 右为真 则结果也为真
System.out.println(a > 100 || b == 2);
// 左为假 且 右为假 则结果为假
System.out.println(a > 100 || b > 100);

3、逻辑非(!)

简单来讲,逻辑非(!)其实就可以直接理解成"取反",也就是把真的变成假的,把假的变成真的

语法规则:!表达式 (注意,这里的感叹号是英文感叹号)

int a = 1;
// a == 1 为true,取个非就是false
System.out.println(!(a == 1));
// a != 1 为false,取个非就是true
System.out.println(!(a != 1));

4、短路求值

逻辑与(&&)和逻辑或(||)都遵守短路求值的规则

System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
我们都知道 ,, 计算 10 / 0 会导致程序抛出异常,   但是上面的代码却能正常运行 ,, 说明 10 / 0 并没有真正被求值!
PS:
  1. 对于逻辑与(&&),如果左侧表达式的值为false,则表达式结果一定是false,无需计算右侧表达式!
  2. 对于逻辑或(||),如果左侧表达式的值为true,则表达式结果一定是true,无需计算右侧表达式!

四、位运算符

位运算符主要有四个: & | ~ ^ ,除 ~ 是一元运算符外,其余都是二元运算符。
Java中数据存储的最小单位是字节,而数据操作的最小单位是比特位。字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据!

位操作表示 按二进制位运算 . 计算机中都是使用二进制来表示数据的 (01 构成的序列 ), 按位运算就是在按照二进制位的每一位依次进行计算!

 

1、按位与(&)

如果两个二进制位都是 1, 则结果为 1, 否则结果为 0
int a = 10;
int b = 20;
System.out.println(a & b); // 输出0

2、按位或(|)

如果两个二进制位都是 0, 则结果为 0, 否则结果为 1
int a = 10;
int b = 20;
System.out.println(a | b); //输出 30

3、按位取反(~)

如果该位为 0 则转为 1, 如果该位为 1 则转为 0
int a = 20;
System.out.println(~a); //输出-21

注意:按位取反时,将该位0转为1,1转为0后得到的是一个补码,我们需要对补码进行转换成原码才能得到我们的十进制数字!!!

补码转原码方法:符号位不变,该位0转为1,1转为0。然后+1就可以的到原码

4、按位异或(^

如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1
int a = 10;
int b = 20;
System.out.println(a^b); // 输出30

五、移位运算

移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。

1、左移(<<)

最左侧位丢掉,最右侧位补0

int a = 10;
System.out.println(a << 1); // 输出20

2、右移(>>)

最右侧位丢掉,如果符号位为1那么最左侧补0,如果符号位为0那么最左侧补1

int a = 10;
System.out.println(a >> 1); // 输出5

3、无符号右移(>>>)

最右侧位对调,最左侧位补0
int a = 10;
System.out.println(a >>> 1); // 输出5

4、小贴士

1. 左移 1 , 相当于原数字 * 2. 左移 N , 相当于原数字 * 2 N 次方
2. 右移 1 , 相当于原数字 / 2. 右移 N , 相当于原数字 / 2 N 次方
3. 由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 N 次方的时候可以用移位运算代替
4. 移动负数位或者移位位数过大都没有意义

六、条件运算符

条件运算符只有一个: 表达式1 ? 表达式2 : 表达式3
表达式 1 的值为 true , 整个表达式的值为 表达式 2 的值 ;
表达式 1 的值为 false , 整个表达式的值为 表达式 3 的值 .
也是 Java 中唯一的一个 三目运算符 , 是条件判断语句的简化写法 .
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;

PS:

表达式2和表达式3的结果要是同类型的,除非能发生类型隐式转换

int a = 10;
int b = 20;
int c = a > b ? 1 : 2.0;

表达式不能单独存在,其生产的结果必须要被使用

nt a = 10;
int b = 20;
a > b? a : b; // 报错:Error:(15, 14) java: 不是语句

七、运算符的优先级

在一条表达式中,各个运算符可以混合起来进行运算,但是运算符的优先级不同,比如: * /
优先级要高于 + 和 - ,有些情况下稍不注意,可能就会造成很大的麻烦。
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + (b - a) >> 1;
System.out.println(c);
上述表达式中,由于 + 的优先级要高于 >> , 因此 a 先和 b-a 的结果做加法,整体为 20 ,最后再进行右移,因此结果 为10
注意:运算符之间是有 优先级 的, 具体的规则我们 不必记忆 在可能存在歧义的代码中加上括号即可!
// 求a和b的平均值
int a = 10;
int b = 20;
int c = a + ((b - a) >> 1);
System.out.println(c);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值