➕ 运算符与表达式
算术/比较/逻辑/赋值/三元运算符 · 优先级表 · 新手陷阱题
1. 算术运算符 + 自增自减陷阱?
| 运算符 | 含义 | 例子(a=10) |
|---|---|---|
| + - * / | 加 减 乘 除 | a / 3 = 3(整数除法!) |
| % | 取余(模) | a % 3 = 1(10÷3 余 1) |
| ++ -- | 自增 1 / 自减 1 | a++ 或 ++a(见陷阱) |
| +(字符串) | 字符串拼接 | "a" + 1 = "a1" |
自增陷阱(面试常考):
i++ 和 ++i 的区别
int i = 5;
System.out.println(i++); // 先取原值 5 再自增 → 输出 5(此时 i 已是 6)
System.out.println(i); 6
int j = 5;
System.out.println(++j); // 先自增再取新值 → 输出 6
6
// 口诀:++ 在前"先加后用",++ 在后"先用后加"
🎯 重点
- % 取余用途:判断奇偶(x%2==0 是偶数)、循环取下标
- 字符串 + 任何东西 = 拼接成字符串:"1+1=" + (1+1) 注意括号
2. 比较运算符和逻辑运算符?
比较运算符(结果都是 boolean):==(等于)、!=(不等于)、>、<、>=、<=
逻辑运算符(连接多个 boolean):
| 运算符 | 含义 | 例子 |
|---|---|---|
| && | 且(两个都真才真) | age >= 18 && age <= 60 |
| || | 或(一个真就真) | score < 60 || score > 100 |
| ! | 取反 | !isLogin |
短路特性(面试点)
// && 左边为 false,右边不执行(短路)
int a = 0;
boolean r = (a != 0) && (10 / a > 1); // 左边 false,右边不执行,不会除零报错
System.out.println(r); false
// 如果不短路(& | 单符号),右边会执行 → 除零异常!
// 所以判断"不为空再操作"时用 &&:obj != null && obj.length() > 0
🎯 易错
- == 是"相等比较",= 是"赋值"——写错是最高频 bug(if (a = 5) 编译都过不了)
- 逻辑运算结果表:&& 一假则假;|| 一真则真
3. 三元运算符和运算优先级?
三元运算符:`条件 ? 值1 : 值2`——条件为真取 1,否则取 2。是 if-else 的简写。
三元运算符
int score = 85;
String result = score >= 60 ? "及格" : "不及格";
System.out.println(result);
及格
// 等价写法:
String r2;
if (score >= 60) { r2 = "及格"; } else { r2 = "不及格"; }
优先级速记(从高到低,括号永远最高):
括号 () > 自增 ++ > 乘除取余 * / % > 加减 + - > 比较 > == != > && > || > 赋值 =
优先级陷阱题(面试常见)
int a = 2, b = 3, c = 4;
System.out.println(a + b * c); // 先乘后加:2 + 12 = 14
System.out.println((a + b) * c); // 括号优先:(5) * 4 = 20
System.out.println(a + b > c); // 先算 a+b=5,再比 5>4 = true
System.out.println(a + (b > c)); // 先算 b>c=false,再 a+false?报错!boolean 不能加
✍️ 练习题(先心算,再运行验证)
- 1. 10 % 3 = ?(答案 1);7 % 2 = ?(答案 1,奇数)
- 2. 下面输出什么:int i=3; System.out.println(i++ + ++i);(答案 8:3 + 5)
- 3. 用三元运算符判断一个数是奇数还是偶数
- 4. 下列结果:true && false || true = ?(答案 true,&& 先算)
- 5. 写代码:判断某年是否为闰年(能被 4 整除且不能被 100 整除,或能被 400 整除):(y%4==0 && y%100!=0) || y%400==0