目录
前言
什么是运算符:运算符是用于执行特定操作的符号或关键字。在编程中,运算符用于处理变量、常量和表达,以执行各种计算和操作。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 二进制位 0 0 0 0 1 0 1 0 20 二进制位 0 0 0 1 0 1 0 0 0 二进制位 0 0 0 0 0 0 0 0 有 0 即 0
2.按位或 |
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
例如
int a = 10; int b = 20; System.out.println(a | b);
同样 需要先把 10 和 20 转成二进制 , 分别为 1010 和 10100
按位或 | 10 二进制位 0 0 0 0 1 0 1 0 20 二进制位 0 0 0 1 0 1 0 0 30 二进制位 0 0 0 1 1 1 1 0 有 1 即 1
注意 : 当 & 和 | 的操作数为整数 (int, short, long, byte) 的时候 , 表示按位运算 , 当操作数为 boolean 的时候 , 表示逻辑运算。
3.按位取反 ~
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
例如
int a = 10; System.out.println(~a);
先把 10 二进制 , 为 1010
按位取反 ~ 10 二进制 0 0 0 0 1 0 1 0 ↓ 补码 - 反码 ↓ 1 1 1 1 0 1 0 1 -11 二进制码 1 0 0 0 1 0 1 0 注意:对于有符号整数的表示,Java使用补码(two’s complement)表示法。补码是一种对负数进行二进制表示的方法。
在补码表示法中,最高位是符号位,0表示正数,1表示负数。对于一个给定的补码,要将其转换为对应的十进制数,可以按照以下步骤进行计算:
如果补码的最高位(符号位)为0,则该补码表示的是一个正数,直接将其转换为原码即可。
如果补码的最高位为1,则该补码表示的是一个负数。此时,要进行如下处理:
- 取补码的反码(将补码中除了符号位之外的每个位取反)。
- 在反码的基础上加1,得到原码。
现在,让我们来解释为什么补码1111 0101被解释为-11:
补码1111 0101的最高位为1,表示一个负数。
将该补码的反码计算为0000 1010。
在反码的基础上加1,得到0000 1011,这就是原码。
所以,根据补码表示法,补码1111 0101解释为-11。
补码的使用方式可以方便地进行整数的加减运算,同时还可以表示一个更广范围的整数值,包括正数和负数。
4. 按位异或 ^
int a = 10; int b = 11; System.out.printf("%d", a ^ b); //结果为1
按位异或 ^ 10 二进制位 0 0 0 0 1 0 1 0 11 二进制位 0 0 0 0 1 0 1 1 1 二进制位 0 0 0 0 0 0 0 1 同 0 异 1
五、移位运算
严格来说移位运算符也是位运算符的一种,都是按照二进制比特位来运算的,移位运算符有三个:<< >> >>> ,都是二元运算符。
1.左移 <<
移除最左侧位, 最右侧补 0。
例:
int a = 10; System.out.printf("%d", a << 1); //结果输出20
左移 << 10 二进制位 0 0 0 0 1 0 1 0 100 二进制位 0 0 0 1 0 1 0 0 注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数。
2.右移 >>
最右侧位不要了, 最左侧补符号位 ( 正数补0, 负数补1 )。
例:
int a = 10; System.out.printf("%d", a >> 1); //结果输出5
右移 >> 10 二进制位 0 0 0 0 1 0 1 0 5 二进制位 0 0 0 0 0 1 0 1 注意:向右移位时,符号位移动后会补位,因此不影响正负。
3.无符号右移 >>>
最右侧位不要了, 最左侧符号位不变,其后补 0。
例:
int a = 10; System.out.printf("%d", a >>> 1); //结果输出5
无符号右移 >>> 10 二进制位 0 0 0 0 1 0 1 0 5 二进制位 0 0 0 0 0 1 0 1 注意:与右移相比,无符号右移不会因为正负而影响左侧位大小。
4.移位运算小结
六、条件运算符
Java中条件运算符只有一个,也是唯一的三目运算符,是条件判断语句的简化写法。
通式:表达式1 ? 表达式2 : 表达式3
即:表达式1 的值为 true 时, 结果返回为 表达式2 的值;
例:
// 求两个整数的最大值 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编程中,运算符是一种非常重要的工具,用于执行各种数学计算、逻辑操作和变量赋值。算术运算符可以对数字进行加减乘除等操作,关系运算符可以比较变量之间的大小关系,逻辑运算符可以处理多个条件的逻辑关系,位运算符可以对二进制数据进行位操作,赋值运算符可以将值赋给变量,条件运算符可以根据条件的真假选择不同的取值。这些运算符的灵活运用,能够帮助我们实现复杂的计算和逻辑控制,从而实现各种功能需求。