第3章:表达式与操作符
本章只讲 Java。表达式是编程的"语法基础",后面每一章都要用。
一个故事开头
假设你开了一家奶茶店。今天来了一个客人,说:"我要 3 杯波波奶茶,每杯 15 块,用会员卡打 9 折。"
你心里算了一下:3 × 15 = 45,打 9 折是 40.5。
这个过程在编程里就叫表达式求值——你把原材料(数字和变量)通过操作符(×、折扣)组合起来,计算机帮你算出结果。
int quantity = 3;
double unitPrice = 15.0;
double total = quantity * unitPrice * 0.9; // 这就是一个表达式这一章就是教你"×"、"+"这些符号在 Java 里怎么写,以及计算机按什么顺序算。
1. 表达式的基本认识
表达式 = 能算出值的任何一段代码。
每个表达式的计算都产生一个结果——数字、真假值、或者字符串。
// 这些都叫表达式:
42 // 最简单的表达式——值就是 42
10 + 5 // 13
age > 18 // true 或 false
"你好" + "世界" // "你好世界"表达式可以嵌套:(3 + 5) * 2 里面就包含了 3 + 5 这个子表达式。
操作符是干什么的
操作符就是"动作指令"——告诉计算机怎么处理两边的值。
int sum = quantity * unitPrice * (1 + TAX_RATE);
// ↑ ↑ ↑ ↑
// 乘法 乘法 加法 括号——先算2. 算术操作符
四则运算
public class Arithmetic {
public static void main(String[] args) {
int a = 10;
int b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3(整数除法!看下面)
System.out.println(a % b); // 1(取余数,10 ÷ 3 = 3 余 1)
}
}💥 拆了它:分清整数除法和浮点数除法
// 运行这段,猜猜每行输出什么
System.out.println(10 / 3); // ?
System.out.println(10.0 / 3); // ?
System.out.println(10 / 3.0); // ?
System.out.println(10.0 / 3.0); // ?结果:
3 ← 整数除法,砍掉小数
3.3333333333333335 ← 浮点数除法,精确
3.3333333333333335
3.3333333333333335规则:两个整数相除 = 整数除法(去尾)。只要有一个是小数 = 浮点数除法(精确)。
取余操作符 %
你可能不熟 %(取余/取模)。它算的是"除法剩下的零头"。
System.out.println(10 % 3); // 1(10 ÷ 3 = 3 余 1)
System.out.println(15 % 5); // 0(15 ÷ 5 = 3 余 0 → 刚好整除)
System.out.println(7 % 9); // 7(7 ÷ 9 = 0 余 7)实际用途(你很快就会遇到):
// 判断奇偶
int num = 7;
boolean isOdd = num % 2 != 0; // true → 7 是奇数
// 输出隔行变色
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
System.out.println("偶数行: " + i);
}
}3. 关系操作符——比大小
关系操作符用来比较两个值,结果永远是 boolean(true 或 false)。
int age = 20;
System.out.println(age > 18); // true
System.out.println(age < 18); // false
System.out.println(age >= 18); // true
System.out.println(age <= 18); // false
System.out.println(age == 18); // false(注意:== 是两个等号!)
System.out.println(age != 18); // true⚠️ 新手必犯错误:= 和 == 搞混
int x = 5;
// 你想判断 x 是否等于 5
if (x = 5) { // ❌ 这行编译都过不去!
}= 是赋值。== 是判断相等。两个完全不同的东西。
// 正确写法
if (x == 5) { // ✅ 判断 x 是否等于 5
}4. 逻辑操作符——组合判断
用来组合多个布尔表达式。
boolean hasMoney = true;
boolean hasID = false;
System.out.println(hasMoney && hasID); // false(两个都要 true 才行)
System.out.println(hasMoney || hasID); // true(至少一个 true 就行)
System.out.println(!hasMoney); // false(取反:true → false)把它们用到实际场景:
int age = 20;
boolean hasID = true;
// 进网吧需要:年满 18 且带了身份证
boolean canEnter = age >= 18 && hasID; // true💥 拆了它:短路特性
Java 的逻辑操作符有"短路"行为——如果左边已经能确定结果,右边就不算了。
int x = 5;
boolean result = (x > 10) && (++x > 0); // 左边 x>10 已经是 false
System.out.println(x); // 5(不是 6!右边根本没执行)
boolean result2 = (x < 10) || (++x > 0); // 左边 x<10 已经是 true
System.out.println(x); // 还是 5(右边又没执行)短路的作用:你可以先检查"条件1"再检查"条件2",不用担心条件2在条件1不成立时报错。
// 安全写法:先检查 name 不是 null,再调 length()
String name = null;
if (name != null && name.length() > 0) { // name != null 是 false → 短路,不调 length()
System.out.println("有名字");
}5. 字符串拼接:+ 的世界
Java 里 + 不仅能做加法,还能拼接字符串。这可能是你最常用的操作之一。
System.out.println("你好" + "世界"); // "你好世界"
System.out.println("结果:" + 42); // "结果:42"
System.out.println(10 + " 个苹果"); // "10 个苹果"
System.out.println("总价:" + (5 + 3)); // "总价:8"规则:当 + 两边至少有一个是 String 时,Java 把它当拼接用——把另一边也转成字符串。
💥 拆了它:拼接顺序陷阱
System.out.println(10 + 20 + " 个苹果"); // ?
System.out.println("苹果: " + 10 + 20); // ?结果:
30 个苹果 ← 10 + 20 先做算术加法(两个 int),再拼字符串
苹果: 1020 ← "苹果: " + 10 先拼出 "苹果: 10",再拼 "20"Java 从左到右计算。 遇到 String 之后,后面的 + 全变成拼接。
6. 赋值操作符
基本赋值
int x = 10; // 把 10 赋给 x复合赋值
int x = 10;
x += 5; // 等价于 x = x + 5; → x = 15
x -= 3; // 等价于 x = x - 3; → x = 12
x *= 2; // 等价于 x = x * 2; → x = 24
x /= 4; // 等价于 x = x / 4; → x = 6
x %= 2; // 等价于 x = x % 2; → x = 0x += 5 比 x = x + 5 少打几个字,而且语义更清晰——"给 x 加 5"。
自增自减
int count = 0;
count++; // count = count + 1 → 1
count--; // count = count - 1 → 0💥 拆了它:前缀和后缀的区别
int a = 5;
System.out.println(a++); // 输出 5,然后 a 变成 6(先取值,后加1)
int b = 5;
System.out.println(++b); // b 先变成 6,然后输出 6(先加1,后取值)int x = 5;
int y = x++ + 2; // x++ 先用 x 的旧值(5)参与运算 → y = 5 + 2 = 7,然后 x 变成 6
System.out.println(x + ", " + y); // 6, 7
int a = 5;
int b = ++a + 2; // ++a 先把 a 加 1 变为 6,再用新值参与运算 → b = 6 + 2 = 8
System.out.println(a + ", " + b); // 6, 8初学阶段,建议只用 x++ 和 ++x 单独一行,不要嵌在表达式里。 省那一个变量不如省 debug 时间。
7. 优先级——先算谁
和数学一样,Java 的表达式也有计算顺序。
记忆口诀:先乘除后加减,有括号先算括号
int result = 10 + 5 * 2; // 10 + 10 = 20(乘法优先)
int result2 = (10 + 5) * 2; // 15 * 2 = 30(括号优先)优先级简表(从高到低)
| 优先级 | 操作符 | 描述 |
|---|---|---|
| 最高 | () | 括号 |
++ -- | 自增自减 | |
* / % | 乘除取余 | |
+ - | 加减 | |
< > >= <= | 关系比较 | |
== != | 相等判断 | |
&& | 逻辑与 | |
| 最低 | || | 逻辑或 |
🧪 动手试试
不用跑代码,先在脑子里算每行的结果:
System.out.println(3 + 4 * 2);
System.out.println((3 + 4) * 2);
System.out.println(10 / 3 + 2.0);
System.out.println(5 > 3 && 2 < 1);
System.out.println(5 > 3 || 2 < 1);
System.out.println(10 + 5 > 12 && 3 * 2 == 6);跑一遍确认你的答案。这是理解表达式的试金石——这关过了,后面任何公式你都能读懂。
8. 完整例子:奶茶店结账系统
public class MilkTeaCheckout {
public static void main(String[] args) {
String drink = "杨枝甘露";
int quantity = 3;
double unitPrice = 18.0;
boolean hasMemberCard = true;
// 计算
double subtotal = quantity * unitPrice; // 54.0
double discount = hasMemberCard ? 0.85 : 1.0; // 会员打 85 折
double finalPrice = subtotal * discount; // 45.9
// 判断
boolean isExpensive = finalPrice > 50;
int priceLevel = (int) (finalPrice / 10); // 4(取整)
// 输出
System.out.println("饮品:" + drink + " × " + quantity);
System.out.println("原价:" + subtotal + "元");
System.out.println("会员:" + (hasMemberCard ? "是" : "否"));
System.out.println("实付:" + finalPrice + "元");
System.out.println("是否超过50元:" + isExpensive);
}
}我猜你会问
Q: && 和 & 有什么区别? A: && 是短路与——左边为 false 右边不执行。& 是非短路与——两边都执行。日常全用 && 和 ||。
Q: 为什么 10.0 / 3 的输出末尾有个奇怪的 5(3.3333333333333335)? A: 浮点数精度问题。有些小数(比如 1/3)用二进制无法精确表示,只能在有限精度下近似。double 保证约 15 位有效数字的精度,最后一位是误差。这会在第9章细讲。
Q: ? : 是什么? A: 三元操作符。条件 ? 值1 : 值2 —— 条件为 true 取左边,false 取右边。是 if-else 的简洁版,适合简单的二选一赋值。
你现在学会的东西
- 表达式 = 能算出值的代码片段
+-*/%— 算术,"两个整数相除结果取整">>=<<===!=— 比较,结果永远是 true/false&&||!— 逻辑组合,&& 优先于 ||=是赋值,==是判断 — 两者不一样- 先乘除后加减,括号优先
- 短路特性:够用就停
+遇字符串变拼接,但注意顺序
✅ 验收标准
完成本章后,你应该能:
- [ ] 区分
=和==,分别说出它们的作用 - [ ] 解释
5 / 2为什么等于2而不是2.5 - [ ] 正确使用
&&和||编写条件组合 - [ ] 解释
"结果: " + 5 + 3为什么输出结果: 53 - [ ] 写出
++count和count++的语义区别
📌 常见卡点
- 整数除法丢小数——想让结果带小数至少一个操作数是 double
- `=` 赋值 vs `==` 相等——新手最常犯的笔误,编译器只会报类型不匹配
- 字符串拼接优先级——`+` 从左算,碰到字符串就变拼接
- 浮点数比较——`0.1 + 0.2 == 0.3` 在 Java 里是 false
🔜 现在不需要理解
- 位运算符 `&`、`|`、`^`、`<<`、`>>`——底层编程才用,初学者跳过
- `instanceof`——学了面向对象再用
- 运算符重载——Java 不支持,C++ 支持,以后遇到再了解
🧪 练习
1. 算结果:在不运行代码的情况下,写出下面每个表达式的值:
10 + 5 * 2
(10 + 5) * 2
10 / 3 + 2.0
5 > 3 && 2 < 1
"总价:" + 2 + 32. 写代码:有三个变量 a=10, b=20, c=30,用关系操作符和逻辑操作符判断 a 是否同时小于 b 和 c。
3. 修bug:下面这段代码编译报错,找出原因并修复。
if (x = 10) {
System.out.println("x 是 10");
}