运算符
类型介绍
(1)算数运算符
(2)赋值运算符
(3)关系运算符(比较运算符)
(4)逻辑运算符
(5)三元运算符
(6)位运算符(需要二进制基础)
一、算数运算符
基本介绍
| 运算符 | 计算 | 范例 | 结果 |
|---|---|---|---|
| + | 正号 | +7 | 7 |
| - | 负号 | b=11; -b | -11 |
| + | 加法 | 9+9 | 18 |
| - | 减法 | 10-8 | 2 |
| * | 乘法 | 7*8 | 56 |
| / | 除法 | 9/9 | 1 |
| % | 取模(取余) | 11%9 | 2 |
| ++ | 自增(前) | a=2;b=b++;a | a=3; b=2 |
| ++ | 自增(后) | a=2;b=++a; | a=3; b=3 |
| -- | 自减(前) | a=2;b=b--;a | a=2; b=1 |
| -- | 自减(后) | a=2;b=--a; | a=1; b=1 |
| + | 字符串拼接 | "hsp"+"edu" | "hspedu" |
使用细节
(1)a++:先用后加
(2)++a:先加后用
(3)/:除法的结果取决于左右操作数,如果都是整数,结果就是整数,例如:8/5=1
(4) %:取模的本质是 a % b = a - a / b * b
-10 % 3 = -10 - (-10) / 3 * 3 = -10 + 9 = -1
10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1
-10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1
(5) 自增、自减运算符的底层本质
自增或者自减后,该结果会采用一个临时变量保存,然后给变量重新赋值
随堂练习
面试题一
java
int i = 1;
i = ++i; // 规则使用临时变量: (1) i = i + 1; (2) temp = i; (3) i = temp;
System.out.println(i); // 2面试题二
java
int i = 1; // i -> 1
i = i++; // 规则使用临时变量: (1) temp = i; (2) i = i + 1; (3) i = temp;
System.out.println(i); // 1二、赋值运算符
基本介绍
注意是从右往左运算,把某个值赋给变量
| 运算符 | 名称 | 说明 |
|---|---|---|
| = | 赋值运算符 | 将右边的值赋给左边的变量 |
| += | 加法赋值运算符 | 将右边的值加到左边的变量上 |
| -= | 减法赋值运算符 | 将右边的值从左边的变量中减去 |
| *= | 乘法赋值运算符 | 将右边的值与左边的变量相乘 |
| /= | 除法赋值运算符 | 将左边的变量除以右边的值 |
| %= | 取余赋值运算符 | 将左边的变量对右边的值取余并赋值 |
使用细节
赋值运算符在底层会自动进行类型转换
java
byte b = 2;
b += 3;
b++;底层实际是 b =(byte)(b+3)
如果写成 b=b+3 必然报错,int 类型不可以赋值给 byte 类型
三、关系运算符
关系运算符的返回结果都是 boolean 型,要么是 true,要么是 false
| 运算符 | 计算 | 范例 | 结果 |
|---|---|---|---|
| == | 相等于 | 8 == 7 | false |
| != | 不等于 | 8 != 7 | true |
| < | 小于 | 8 < 7 | false |
| > | 大于 | 8 > 7 | true |
| <= | 小于等于 | 8 <= 7 | false |
| >= | 大于等于 | 8 >= 7 | true |
| instanceof | 检查是否是类的对象 | "hsp" instanceof String | true |
四、逻辑运算符
基本介绍
| 运算符 | 类型 | 说明 |
|---|---|---|
| & | 逻辑与 | 位运算中的按位与,两个操作数逐位比较,均为 1 时结果为 1 |
| && | 短路与 | 短路与,只有两个操作数都为 true 时结果才为 true |
| | | 逻辑或 | 位运算中的按位或,只要有一个为 1 结果为 1 |
| || | 短路或 | 短路或,只要有一个为 true,结果为 true |
| !a | 逻辑非 | 逻辑非,取反操作 |
| a ^ b | 逻辑异或 | 逻辑异或,两个操作数不同时结果为 true |
举例说明
(1)a & b: 逻辑与:当 a 和 b 同时为 true,则结果为 true,否则为 false
(2)a && b: 逻辑与:&& 短路运算:当 a 和 b 同时为 true,则结果为 true,否则为 false
(3)a | b: 逻辑或:当 a 和 b, 有一个为 true,则结果为 true,否则为 false
(4)a || b: 逻辑或:|| 短路运算:当 a 和 b, 有一个为 true,则结果为 true,否则为 false
(5)!a: 取反:或者非运算。当 a 为 true,则结果为 false,当 a 为 false,则结果为 true
(6)a ^ b: 逻辑异或:当 a 和 b 不同时,则结果为 true,否则为 false
使用细节
(1)区别 & 和 &&
& 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低。
&& 短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高。
(2)区别 | 和 ||
| 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低。
|| 短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高。
小结
(1)逻辑与、逻辑非,在条件成立时会继续判断后面的条件
(2)短路与、短路或,在条件成立时不会继续判断后面的条件
五、三元运算符
基本介绍
java
int res=a > b ? a++ : --b;解释:如果条件成立,执行结果 a,如果条件不成立,执行结果 b
本质是 if - else 结构
java
if(a > b){
res = a;
}
else{
res = b;
}使用细节
数据类型转换问题,高精度的数据类型不可以赋值给低精度的数据类新
代码示例
java
public class TernaryOperatorDetail {
public static void main(String[] args) {
// 表达式 1 和表达式 2 要为可以赋给接收变量的类型
// (或可以自动转换/或者强制转换)
int a = 3;
int b = 8;
// 使用三元运算符进行赋值
int c = a > b ? (int) 1.1 : (int) 3.4; // 强制转换成 int 类型
System.out.println("c = " + c); // 输出 c 的值
double d = a > b ? a : b + 3; // 可以的,满足 int -> double 自动类型转换
System.out.println("d = " + d); // 输出 d 的值
}
}六、运算符优先级
| 优先级 | 运算符 | 描述 | 结合方向 |
|---|---|---|---|
| 1 | () [] . | 括号、数组下标、成员访问 | 左到右 |
| 2 | ++ -- + - ~ ! | 单目运算符(前置)、正负号、逻辑非 | 右到左 |
| 3 | * / % | 乘、除、取模 | 左到右 |
| 4 | + - | 加法、减法 | 左到右 |
| 5 | << >> >>> | 左移、右移、无符号右移 | 左到右 |
| 6 | < <= > >= instanceof | 比较、小于等 | 左到右 |
| 7 | == != | 等于、不等于 | 左到右 |
| 8 | & | 按位与 | 左到右 |
| 9 | ^ | 按位异或 | 左到右 |
| 10 | | | 按位或 | 左到右 |
| 11 | && | 逻辑与 | 左到右 |
| 12 | || | 逻辑或 | 左到右 |
| 13 | ?: | 条件(三元)运算符 | 右到左 |
| 14 | = += -= *= /= %= | 赋值及复合赋值运算符 | 右到左 |
| &= ^= |= <<= >>= >>>= | 赋值及复合赋值运算符 | 右到左 | |
| 15 | -> :: | Lambda 和 方法引用 | 左到右 |
结合方向:表示多个相同优先级的运算符出现时,按哪个方向结合
例如:a - b + c 是左结合,即 ((a - b) + c)
