public class hello{
public static void main(String[] args){
//在%的本质看一个公式!!!!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
System.out.println(10 % 3); //1
System.out.println(-10 % 3); //-1
System.out.println(10 %-3); //1
System.out.println(-10 %-3);//-1
}
}
自增运算符的底层本质
复制代码
### 自增的值会采用一个临时变量保存,后续再重新赋值
复制代码
### 面试题一
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
二、赋值运算符
注意是从右往左运算,把某个值赋给变量
类型
= : 赋值运算符,将右边的值赋给左边的变量
+= : 加法赋值运算符,将右边的值加到左边的变量上
-= : 减法赋值运算符,将右边的值从左边的变量中减去
*= : 乘法赋值运算符,将右边的值与左边的变量相乘
/= : 除法赋值运算符,将左边的变量除以右边的值
%= : 取余赋值运算符,将左边的变量对右边的值取余并赋值
注意:符合赋值运算符会进行类型转换
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
四、逻辑运算符
类型
逻辑与
复制代码
### a `&` b
复制代码
### a `&&` b
逻辑或
复制代码
### a `|` b
复制代码
### a `||` b
!a:逻辑非
a ^ b:逻辑异或
使用规则
a & b: 逻辑与:当 a 和 b 同时为 true,则结果为 true,否则为 false
a && b: 逻辑与:&& 短路运算:当 a 和 b 同时为 true,则结果为 true,否则为 false
a | b: 逻辑或:当 a 和 b, 有一个为 true,则结果为 true,否则为 false
a || b: 逻辑或:|| 短路运算:当 a 和 b, 有一个为 true,则结果为 true,否则为 false
!a: 取反:或者非运算。当 a 为 true,则结果为 false,当 a 为 false,则结果为 true
a ^ b: 逻辑异或:当 a 和 b 不同时,则结果为 true,否则为 false
区别|| 和 | ; && 和 &
&& 短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高。
& 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低。
|| 短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高。
| 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低。
总结
短路在条件成立时不会继续判断后面的条件
逻辑非,逻辑与在条件成立时会继续判断后面的条件
& 和 && 的代码示例
java复制代码
public class Hello {
// 编写一个main方法
public static void main(String[] args) {
// && 短路与和 & 案例演示
int age = 50;
// 使用 && 短路与
if (age > 20 && age < 90) {
System.out.println("ok100");
}
// 使用 & 逻辑与
if (age > 20 & age < 90) {
System.out.println("ok200");
}
// 区别
int a = 4;
int b = 9;
// 对于 && 短路与而言,如果第一个条件为 false, 后面的条件不再判断
// 对于 & 逻辑与而言,如果第一个条件为 false, 后面的条件仍然会判断
if (a < 1 & ++b < 50) {
System.out.println("ok300");
}
System.out.println("a=" + a + " b=" + b); // 输出 a=4 b=10
}
}
| 和 ||的代码示例
java复制代码
public class LogicOperator02 {
// 编写一个main方法
public static void main(String[] args) {
// || 短路或和 | 逻辑或案例演示
// || 规则: 两个条件中只要有一个成立,结果为 true,否则为 false
// | 规则: 两个条件中只要有一个成立,结果为 true,否则为 false
int age = 50;
// 使用 || 短路或
if (age > 20 || age < 30) {
System.out.println("ok100");
}
// 使用 | 逻辑或
if (age > 20 | age < 30) {
System.out.println("ok200");
}
// 看看区别
// (1) || 短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
// (2) | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
int a = 4;
int b = 9;
// 使用 || 短路或,如果条件满足,第一个条件为 true
if (a > 1 || ++b > 4) { // 可以换成 | 来测试
System.out.println("ok300");
}
// 输出 a 和 b 的值
System.out.println("a=" + a + " b=" + b); // 4 10
}
}
五、三元运算符
使用方法示例:int res=a > b ? a++ : --b;
解释:如果条件成立,执行结果 a,如果条件不成立,执行结果 b
本质是 if - else 结构
代码示例
java复制代码
if(a > b)
{
res = a;
}
else
{
res = b;
}
注意:数据类型转换问题
代码示例
java复制代码
public class TernaryOperatorDetail {
// 编写一个main方法
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 的值
}
}