1. 算术运算符
| 符号 |
作用 |
说明 |
+ |
加 |
还可用作字符串拼接 |
- |
减 |
|
* |
乘 |
|
/ |
除 |
整数相除会舍去小数部分 |
% |
取模 / 取余 |
结果符号与被除数一致 |
++ |
自增 |
变量 +1 |
-- |
自减 |
变量 -1 |
1 2 3 4 5 6 7 8 9 10 11
| int a = 10; int b = 3;
System.out.println(a + b); System.out.println(a - b); System.out.println(a * b); System.out.println(a / b); System.out.println(a % b);
System.out.println(10.0 / 3);
|
字符串拼接:
1 2
| System.out.println("Hello" + " World"); System.out.println("a + b = " + (a + b));
|
++ 和 -- 的前置后置:
1 2 3 4
| int i = 10; System.out.println(i++); System.out.println(++i); System.out.println(i);
|
2. 数据类型转换
运算时经常遇到类型不一致的情况,需要类型转换。
2.1 隐式转换(自动)
范围小 -> 范围大,系统自动完成,不需要写任何代码。
1 2 3
| int n = 10; double d = n; System.out.println(d);
|
注意:byte、short、char 在参与运算时,会先提升为 int 再进行运算:
1 2 3 4 5
| byte b1 = 10; byte b2 = 20;
int sum = b1 + b2; System.out.println(sum);
|
2.2 强制转换(手动)
范围大 -> 范围小,可能丢失精度,需要手动写 (目标类型):
1 2 3
| double pi = 3.99; int n = (int) pi; System.out.println(n);
|
注意:强制转换若超出目标类型范围,结果会“溢出”成很奇怪的数,务必谨慎使用。
1 2 3
| int big = 300; byte small = (byte) big; System.out.println(small);
|
3. 赋值运算符
| 符号 |
作用 |
说明 |
= |
赋值 |
int a = 10; 将 10 赋给变量 a |
+= |
加后赋值 |
a += b 等价于 a = a + b |
-= |
减后赋值 |
a -= b 等价于 a = a - b |
*= |
乘后赋值 |
a *= b 等价于 a = a * b |
/= |
除后赋值 |
a /= b 等价于 a = a / b |
%= |
取余后赋值 |
a %= b 等价于 a = a % b |
1 2 3 4 5 6 7
| int a = 10; a += 5; a -= 3; a *= 2; a /= 4; a %= 4; System.out.println(a);
|
4. 关系运算符
| 符号 |
说明 |
== |
判断是否等于 |
!= |
判断是否不等于 |
> |
大于 |
>= |
大于等于 |
< |
小于 |
<= |
小于等于 |
关系运算的结果是 boolean 类型:
1 2 3 4 5 6 7 8 9 10 11
| int x = 5; int y = 8;
System.out.println(x == y); System.out.println(x != y); System.out.println(x > y); System.out.println(x < y); System.out.println(x >= 5);
boolean r = x > y; System.out.println(r);
|
5. 逻辑运算符
| 符号 |
作用 |
说明 |
& |
逻辑与 |
两边都为真,结果才为真 |
| |
逻辑或 |
只要一边为真,结果就为真 |
^ |
逻辑异或 |
两边不同才为真,相同为假 |
! |
逻辑非 |
取反 |
&& |
短路与 |
结果与 & 相同,但左边为 false 时不再判断右边 |
|| |
短路或 |
结果与 | 相同,但左边为 true 时不再判断右边 |
逻辑运算的真值表(A、B 分别代表左右两边的布尔值):
| A |
B |
A & B |
A | B |
A ^ B |
!A |
| true |
true |
true |
true |
false |
false |
| true |
false |
false |
true |
true |
false |
| false |
true |
false |
true |
true |
true |
| false |
false |
false |
false |
false |
true |
短路与 &&、短路或 || 的区别在于“短路”:能提前确定结果就不再执行右边。
1 2 3 4 5 6 7 8 9
| int i = 10; boolean ret1 = (i++ < 5) && (i++ < 20); System.out.println(ret1); System.out.println(i);
int j = 10; boolean ret2 = (j++ > 5) || (j++ < 20); System.out.println(ret2); System.out.println(j);
|
6. 三元运算符
语法:数据类型 变量 = 条件 ? 值1 : 值2;
- 条件为
true,返回 值1
- 条件为
false,返回 值2
- 三元表达式的结果必须被使用:赋值、打印或返回,不能单独写在一行
1 2 3 4 5 6 7
| int a = 10; int b = 20;
int max = a > b ? a : b; System.out.println(max);
System.out.println(a > b ? "a 更大" : "b 更大");
|
三元运算可以嵌套,但嵌套过深可读性差,建议用 if-else 代替:
1 2 3 4
| int m = 15;
int max2 = a > b ? (a > m ? a : m) : (b > m ? b : m); System.out.println(max2);
|
7. 运算符优先级
不同运算符混在一起时,先执行优先级高的。优先级从高到低(数字越小优先级越高):
| 优先级 |
运算符 & 分隔符 |
| 1 |
. () {} |
| 2 |
(类型) 强制转换 一元 +/- ! ~ ++ -- |
| 3 |
* / % |
| 4 |
二元 +/- |
| 5 |
<< >> >>> |
| 6 |
< <= > >= instanceof |
| 7 |
== != |
| 8 |
& |
| 9 |
^ |
| 10 |
| |
| 11 |
&& |
| 12 |
|| |
| 13 |
? : |
| 14 |
= += -= *= /= %= &= ` |
记不住优先级没关系,多用括号,可读性更强,也更不容易出错。