Java-运算符

目录

前言

一、算术运算符

1.基本算数运算符

2.增量运算符

3.自增/自减运算符

二、关系运算符 

三、逻辑运算符

 1.逻辑与 &&

 2.逻辑或  | |

3.逻辑非   !  

4. 短路求值

四、位运算符

 1.按位与 &

 2.按位或  |

 3.按位取反 ~

4. 按位异或 ^ 

五、移位运算

1.左移 <<

2.右移 >>

3.无符号右移 >>>

4.移位运算小结

六、条件运算符

总结

END...


前言

        什么是运算符:运算符是用于执行特定操作的符号或关键字。在编程中,运算符用于处理变量、常量和表达,以执行各种计算和操作。Java中常见的运算符包括:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符以及条件运算符等。


一、算术运算符

        计算机的的用途之一就是执行数学运算,算术运算符就用来执行一些基本的数学运算,其中又可以分为基本算数运算符,增量运算符自增/自减运算符。

1.基本算数运算符

 +  −  ⁎  /  ⁒

和数学中的四则运算 (+  −  ⁎  /) 相同,但计算机中还有一个特殊的运算符:取模'  '

int a = 5;
int b = 2;
System.out.println(a + b); // 7
System.out.println(a - b); // 3
System.out.println(a * b); // 10
System.out.println(a / b); // 2 --->这里的除法只取整数
System.out.println(a % b); // 1 --->模运算就是求数学中的余数

        这些运算符都为 二元运算符,即运算符两端都需要有操作数;

        在除法,取余运算中符号右侧不能为 0 (0不能做除数);

        % 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模;

System.out.println(5.5 % 2.0); //输出1.5

        在运算中,两侧操作数类型不一致时,会向类型大的提升,运算结果会保留操作数中范围较大的数据类型。

        例如在除法运算中:如果是整形则输出结果只保留整数部分,如果运算符左右两侧存在浮点型,则输出结果为浮点型(小数)。

例:

System.out.println (5 / 2); //结果为2不保留小数

System.out.println (5.0 / 2);
System.out.println (5 / 2.0); //三者结果均为2.5
System.out.println (5.0 / 2.0);

如果操作数限定为int等整形,可以通过 * 0.1实现数学运算:

int a = 5;
int b = 2;

System.out.println (a*0.1 / b);
    //或
double c = a*0.1/b;
System.out.println (c);

2.增量运算符

        增量运算符 (+=  −=  ⁎=  /=  ⁒=) 的目的是将其运算结果直接返回自身,相当于是基本算数运算形式的简写,所以也需要两个操作数参与运算,是二元运算符

int a = 1;
a += 2; // 相当于 a = a + 2
System.out.println(a); // 输出3
a -= 1; // 相当于 a = a - 1
System.out.println(a); // 输出2
a *= 3; // 相当于 a = a * 3
System.out.println(a); // 输出6
a /= 3; // 相当于 a = a / 3
System.out.println(a); // 输出2
a %= 3; // 相当于 a = a % 2
System.out.println(a); // 输出2

        这里面需要注意的是:由于运算结果最终会返回自身,所以只有变量才能进行增量运算。 

3.自增/自减运算符

         自增/自减 (++  −−) 运算符的结果也直接返回自身,++是给变量自身+1−−是给变量自身−1,同样的,只有变量才可以进行自增自减运算。

int a = 1;
a++; // 后置++ 表示给a的值加1,此时a的值为2
System.out.println(a++); // 注意:后置++是先使用变量原来值,表示式结束时给变量+1,因此输出2
System.out.println(a); // 输出3
++a; // 前置++ 表示给a的值加1
System.out.println(++a); // 注意:前置++是先给变量+1,然后使用变量中的值,因此输出5
System.out.println(a); // 输出5
// --操作符给操作-1,与++含义类似

注意:如果单独使用,【前置++】和【后置++】没有任何区别,如果混合使用,【前置++】先+1,然后使用变量+1之后的值,【后置++】先使用变量原来的值,表达式 结束时给变量+1。−−与++同理。


二、关系运算符 

         关系运算符主要有六个: 相等(==) ,  不相等(!=)   小于(<)   大于(>)   小于等于(<=)   大于等于(>=) ,其计算返回结果是 true 或者 false

例如:

int a = 10;
int b = 20;
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

注意:在Java中单个 = 表示赋值,== 才能表示相等,而且在进行多次判别是不能进行连续比较,例如3 < a < 5,这种写法在Java中是不允许的。


三、逻辑运算符

         逻辑运算符主要有三个: 与(&&)   或 ( || )   非( ! ) ,运算结果都是 布尔 (boolean) 类型。

 1.逻辑与 &&

         表示形式为:表达式1 && 表达式2,左右表达式必须是boolean类型

判断:

表达式1表达式2结果
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类型

判断:

表达式1表达式2结果
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;
System.out.println(!(a == 1)); // a == 1 为true,取个非就是false
System.out.println(!(a != 1)); // a != 1 为false,取个非就是true

4. 短路求值

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

什么是短路求值呢?

 以如下代码为例:

System.out.println(10 > 20 && 10 / 0 == 0);  // 打印 false
System.out.println(10 < 20 || 10 / 0 == 0);  // 打印 true

在之前我们说过 / 与 % 的右边不能有0参与运算,这样会导致程序抛出异常,但这里却能征程运行,这就是因为逻辑与 (&&) ,逻辑或 ( || ) 遵守短路求值,即:

  • 对于 && , 如果 左侧表达式值为 false, 则表达式结果一定是 false, 无需计算右侧表达式 .
  • 对于 | |, 如果 左侧表达式值为 true, 则表达式结果一定是 true, 无需计算右侧表达式 .
  • 特殊的:& | 如果表达式结果为 boolean , 也表示逻辑运算 . 但与 && || 相比 , 它们不支持短路求值 .
反例:
System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常
System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常

四、位运算符

         位运算符是用于在二进制级别对数字进行操作的运算符。它们直接处理数字的二进制表示形式的位;Java 中数据存储的最小单位是字节,而数据操作的最小单位是比特位.。字节是最小的存储单位,每个字节是由8个二进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。

        位运算符主要有四个: &  |  ~  ^ ,除  一元运算符外,其余都是二元运算符

 1.按位与 &

        如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.

例如

int a = 10;
int b = 20;
System.out.println(a & b);
进行按位运算 , 需要先把 10 20 转成二进制 , 分别为 1010 10100
按位与 &
10 二进制位00001010
20 二进制位00010100
0 二进制位00000000

有 0 即 0


 2.按位或  |

        如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.

例如

int a = 10;
int b = 20;
System.out.println(a | b);
同样 需要先把 10 20 转成二进制 , 分别为 1010 10100
按位或  |
10 二进制位00001010
20 二进制位00010100
30 二进制位00011110

有 1 即 1

注意 : & | 的操作数为整数 (int, short, long, byte) 的时候 , 表示按位运算 , 当操作数为 boolean 的时候 , 表示逻辑运算。

 3.按位取反 ~

         如果该位为 0 则转为 1, 如果该位为 1 则转为 0

例如

int a = 10;
System.out.println(~a);
先把 10 二进制 , 1010 
按位取反 ~
10 二进制00001010
↓ 补码 - 反码 ↓11110101
-11 二进制码10001010

注意:对于有符号整数的表示,Java使用补码(two’s complement)表示法。补码是一种对负数进行二进制表示的方法。

        在补码表示法中,最高位是符号位,0表示正数,1表示负数。对于一个给定的补码,要将其转换为对应的十进制数,可以按照以下步骤进行计算:

  1. 如果补码的最高位(符号位)为0,则该补码表示的是一个正数直接将其转换为原码即可。

  2. 如果补码的最高位为1,则该补码表示的是一个负数。此时,要进行如下处理:

    • 取补码的反码(将补码中除了符号位之外的每个位取反)。
    • 在反码的基础上加1,得到原码

现在,让我们来解释为什么补码1111 0101被解释为-11:

  1. 补码1111 0101的最高位为1,表示一个负数。

  2. 将该补码的反码计算为0000 1010。

  3. 在反码的基础上加1,得到0000 1011,这就是原码。

所以,根据补码表示法,补码1111 0101解释为-11。

补码的使用方式可以方便地进行整数的加减运算,同时还可以表示一个更广范围的整数值,包括正数和负数。


4. 按位异或 ^ 

        两数字的二进制位相同, 则结果为 0, 相异则结果为 1 

int a = 10;
int b = 11;

System.out.printf("%d", a ^ b); //结果为1
按位异或 ^
10 二进制位00001010
11 二进制位00001011
1 二进制位00000001

同 0 异 1

五、移位运算

        严格来说移位运算符也是位运算符的一种,都是按照二进制比特位来运算的,移位运算符有三个<<   >>   >>> ,都是二元运算符。


1.左移 <<

        移除最左侧位, 最右侧补 0。

例:

int a = 10;
System.out.printf("%d", a << 1); //结果输出20
左移 <<
10 二进制位00001010
100 二进制位00010100
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数。

2.右 >>

        最右侧位不要了, 最左侧补符号位 ( 正数补0, 负数补1 )。

例:

int a = 10;
System.out.printf("%d", a >> 1); //结果输出5
右移 >>
10 二进制位00001010
5 二进制位00000101
注意:向右移位时,符号位移动后会补位,因此不影响正负。

3.无符号右移 >>>

        最右侧位不要了, 左侧符号位不变,其后补 0

例:

int a = 10;
System.out.printf("%d", a >>> 1); //结果输出5
无符号右移 >>>
10 二进制位00001010
5 二进制位00000101
注意:与右移相比,无符号右移不会因为正负而影响左侧位大小。

4.移位运算小结

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

六、条件运算符

        Java中条件运算符只有一个,也是唯一的三目运算符,是条件判断语句的简化写法。

        通式:表达式1 ? 表达式2 : 表达式3

        即:表达式1 的值为 true , 结果返回为 表达式2 的值;

               表达式1 的值为 false 时, 结果返回为 表达式3 的值。

例:

// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b; 

 需要注意的是:

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

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

反例:

int a = 10;
int b = 20;
a > b? a : b; //报错

总结

        在这些不同的运算符之间存在优先级 但是具体的规则我们不必记忆。只要在可能存在歧义的代码中加上括号即可

        在Java编程中,运算符是一种非常重要的工具,用于执行各种数学计算、逻辑操作和变量赋值。算术运算符可以对数字进行加减乘除等操作,关系运算符可以比较变量之间的大小关系,逻辑运算符可以处理多个条件的逻辑关系,位运算符可以对二进制数据进行位操作,赋值运算符可以将值赋给变量,条件运算符可以根据条件的真假选择不同的取值。这些运算符的灵活运用,能够帮助我们实现复杂的计算和逻辑控制,从而实现各种功能需求。


END...

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值