2.3 Java中的运算符
运算符就是"对格子里的数做动作"的工具——按算术、赋值、比较、逻辑四大家族记,20 个符号一点不多。本节两大雷区:整数除法砍小数、= 和 == 是两个东西。
前置知识:2.2 Java中的变量(变量三要素、赋值号 = 的读法)。
1. 算术运算符:做数学题的
| 运算符 | 名字 | 例子(int a=10, b=3) | 结果 | 说明 |
|---|---|---|---|---|
+ |
加 | a + b |
13 |
也能拼接字符串 |
- |
减 | a - b |
7 |
|
* |
乘 | a * b |
30 |
注意:不是 × |
/ |
除 | a / b |
3 ⚠️ |
整数除法砍掉小数 |
% |
取余 | a % b |
1 |
10 ÷ 3 = 商 3 余 1 |
++ |
自增 | a++ |
a 变 11 | 自己加 1 |
-- |
自减 | a-- |
a 变 9 | 自己减 1 |
1.1 第一个雷:整数 ÷ 整数 = 整数
System.out.println(10 / 3); // 3 ← 不是 3.33!小数直接砍掉
System.out.println(10.0 / 3); // 3.3333333333333335 ← 只要有小数参与,就按小数算
运算结果看参与运算的"最高类型"。两边都是 int,结果就是 int——小数部分直接砍掉(不是四舍五入)。想要小数,让任意一边变成小数:10.0 / 3 或 (double) a / b。
这是后面"数据类型"和"类型转换"的伏笔,先记住现象。
1.2 % 取余:数学里的"余数"
System.out.println(10 % 3); // 1(10 ÷ 3 商 3 余 1)
System.out.println(9 % 3); // 0(整除,余 0)
System.out.println(10 % 4); // 2
取余看着不起眼,实际是高频工具:
- 判断奇偶:
n % 2 == 0→ 偶数,== 1→ 奇数 - 判断整点:
分钟 % 15 == 0→ 每到 15 分钟触发一次 - 拆位数:
123 % 10→ 拿到个位 3
1.3 + 的第二副面孔:字符串拼接
System.out.println(5 + 3); // 8 ← 两边是数字,做加法
System.out.println("5" + 3); // "53" ← 一边是字符串,变拼接!
System.out.println("年龄:" + 18); // "年龄:18" ← 打印变量时的常用套路
System.out.println(1 + 2 + "a"); // "3a" ← 从左到右:先算 1+2=3,再拼 "a"
System.out.println("a" + 1 + 2); // "a12" ← 先拼成 "a1",再拼上 2
+ 一旦碰到字符串,就不再做数学——从左到右逐个处理,碰到字符串之后全变拼接。"a" + 1 + 2 是 "a12" 不是 "a3"。
1.4 自增自减:++ 和 --
int a = 5;
a++; // 等价于 a = a + 1,a 变 6
a--; // 等价于 a = a - 1,a 变 5
单独用的时候,a++ 和 ++a 效果一样。区别只在"边算边用"时:
| 写法 | 名字 | 行为 | 例子(a=5) |
|---|---|---|---|
a++ |
后置自增 | 先用旧值,再加 1 | System.out.println(a++); 打印 5,a 变 6 |
++a |
前置自增 | 先加 1,再用新值 | System.out.println(++a); 打印 6,a 变 6 |
符号在前先加,符号在后先用。初学阶段建议:++ 单独一行用,别把它塞进表达式里——没人夸你代码写得多紧凑,只会夸你看得懂。
2. 赋值运算符:把值装进格子
核心是 =——2.2 讲过:把右边的值装进左边的格子,不是"等于"。
扩展赋值运算符是"自己参与运算再装回自己"的缩写:
| 写法 | 等价于 | 说明 |
|---|---|---|
a += 3 |
a = a + 3 |
加 3 再装回 |
a -= 3 |
a = a - 3 |
减 3 再装回 |
a *= 3 |
a = a * 3 |
乘 3 再装回 |
a /= 3 |
a = a / 3 |
除 3 再装回 |
a %= 3 |
a = a % 3 |
取余再装回 |
int score = 60;
score += 10; // 70 —— 加 10 分
score -= 20; // 50 —— 扣 20 分
byte b = 1; b = b + 1; 报错(b+1 按整数算,结果是 int,装不回 byte 格子);
但 b += 1; 不报错——扩展赋值运算符内部自带一次强制转换。这是考试和面试的常客,也是为什么很多人说"+= 不等于展开写"。
3. 比较运算符:出判断题的
比较运算符不产生数字,产生 boolean(true / false)——2.1 认过的布尔常量在这里正式上岗:
| 运算符 | 意思 | 例子(int a=10, b=3) | 结果 |
|---|---|---|---|
== |
等于吗 | a == b |
false |
!= |
不等于吗 | a != b |
true |
> |
大于吗 | a > b |
true |
< |
小于吗 | a < b |
false |
>= |
大于或等于吗 | a >= 10 |
true |
<= |
小于或等于吗 | a <= 3 |
false |
int age = 18;
boolean isAdult = age >= 18; // true —— 判断结果可以存进 boolean 格子
System.out.println(10 == 10.0); // true —— 数字比较会统一类型后比
a = 5:赋值,把 5 装进 aa == 5:判断,问 a 是不是 5,结果是 true/false
手滑写错时 if (a = 5) 这种 bug Java 直接编译报错(if 需要布尔值,不接受 int)——比 C 语言友好,但养成习惯:判断用两个等号,念作"等于吗"。
另一个坑:字符串比较别用 ==,要用 equals()——这个坑第三章后再挖,现在先埋个记忆锚点。
4. 逻辑运算符:把多个判断连起来
比较运算符一次只能问一个问题,逻辑运算符把多个问题串成一个:
| 运算符 | 意思 | 规则 | 例子 |
|---|---|---|---|
&& |
并且(AND) | 两边都 true 才 true | age >= 18 && age <= 60(18 到 60 之间) |
\|\| |
或者(OR) | 一边 true 就 true | score < 0 \|\| score > 100(分数非法) |
! |
取反(NOT) | true 变 false,false 变 true | !(a > b)(不是 a 大于 b) |
&& 打两个 &(Shift+7);|| 打两个 |(Shift+回车上面那个键)。单个 & 和 | 也存在但不短路,初学一律用双的。
4.1 && 的"短路"特效
int a = 5;
System.out.println(a > 10 && ++a > 0); // false
System.out.println(a); // 还是 5!++a 根本没执行
&& 左边已经是 false 时,右边直接跳过不执行(结果注定是 false,何必白算)——这叫短路。同理 || 左边是 true 时右边跳过。
这个特效现在只需要知道现象,第三章讲 if 判断时会大量用到它(比如防空指针:s != null && s.length() > 0)。
5. 优先级与括号:拿不准就加括号
运算符有先算后算的顺序(乘除余 > 加减 > 比较 > 逻辑 > 赋值),但别背优先级表——两个办法解决一切:
- 小括号优先级最高,拿不准就加:
(a + b) * c - IDEA 会有提示,报错当场改
唯一建议记住的一条:% 和 *、/ 同级,先于 +、-。
System.out.println(10 + 3 * 2); // 16 —— 先乘后加
System.out.println((10 + 3) * 2); // 26 —— 括号改变顺序
System.out.println(10 % 3 * 2); // 2 —— % 和 * 同级,从左到右
6. 动手:在 IDEA 里把运算符全跑一遍
第 1 步:打开 IDEA,进 IDEA02 项目 → src 右键 → New → Java Class → 输入 Demo04。
第 2 步:输入 psvm 按 Tab 生成主方法,抄入:
public class Demo04 {
public static void main(String[] args) {
int a = 10, b = 3;
System.out.println("整除:" + a / b); // 3
System.out.println("小数除:" + 10.0 / b); // 3.33...
System.out.println("取余:" + a % b); // 1
System.out.println("拼接:" + "分" + a); // 分10
System.out.println("判断:" + (a > b)); // true(注意外层括号!)
}
}
System.out.println("判断:" + a > b); 会直接编译报错——+ 先把 a 和 "判断:" 拼成字符串,字符串没法和 b 比较。这就是优先级的活教材:拼接和比较抢同一个 + 位置时,用括号表态。
第 3 步:绿三角 ▶ 运行,对照注释核对 5 行输出,全对就过。
第 4 步(30 秒实验):把 a / b 改成 (double) a / b,再跑一次,看小数怎么出来的。
7. 常见误区小结
不是。是直接砍掉小数(向零取整):10 / 3 = 3,-10 / 3 = -3。
是 "53"。一边是字符串,+ 就变拼接。
单独一行随便换;塞进表达式里结果不同(先用旧值 vs 先加再用)。
结果多数时候一样,但 && 会短路(左边定了就不看右边)。初学一律用 &&。
暂时记住"字符串比较用 equals()",原理第三章挖。
8. 自测题
7 / 2 输出 3(整数除法砍掉小数);7 % 2 输出 1(7 ÷ 2 商 3 余 1)。顺便:n % 2 == 1 就是"n 是奇数"的判断。
总分:6040。从左到右:先 "总分:" + 60 拼成字符串 "总分:60",再和 40 拼成 "总分:6040"。想算加法得写 "总分:" + (60 + 40)。
12。拆开看:a++ 先用旧值 5(a 变 6),++a 先加 1 变 7 再用,5 + 7 = 12。能独立算对说明前缀后缀真懂了——但实际写代码别这么玩。
b = b + 1 报错:b+1 提升为 int,int 装不回 byte 格子。b += 1 不报错:扩展赋值自带强制转换。这就是"+= 不完全等于展开写"的原因。
boolean ok = score >= 60 && score <= 100;(true)。注意别写成数学式的 60 <= score <= 100——Java 不认,会比较完 boolean 再和数字比,直接编译错。
9. 下一步学什么
- ☐ 2.4 选择结构语句 —— boolean 正式上岗当路标:if 家族挨个问、switch 对号入座;
10 / 3砍小数在score / 10分段里实战 - ☐ 动手作业:
Demo04跑通 + 做一次(double) a / b实验
10. 相关笔记
- 2.2 Java中的变量 ← 上一篇:
=赋值的完整读法 - 2.1 Java基本语法 ← 六种常量(布尔常量在本节上岗)
- 📇 Java基础 · 索引
- 🏠 返回主页