Skip to content

第3章:表达式与操作符

本章只讲 Java。表达式是编程的"语法基础",后面每一章都要用。

你将学会
算术·比较·逻辑·赋值运算符
前置知识
第2章 变量与类型
预计时间
35 分钟
需要准备
JDK + 编辑器
完成标志
写出含多种运算的程序

一个故事开头

假设你开了一家奶茶店。今天来了一个客人,说:"我要 3 杯波波奶茶,每杯 15 块,用会员卡打 9 折。"

你心里算了一下:3 × 15 = 45,打 9 折是 40.5。

这个过程在编程里就叫表达式求值——你把原材料(数字和变量)通过操作符(×、折扣)组合起来,计算机帮你算出结果。

java
int quantity = 3;
double unitPrice = 15.0;
double total = quantity * unitPrice * 0.9;  // 这就是一个表达式

这一章就是教你"×"、"+"这些符号在 Java 里怎么写,以及计算机按什么顺序算。


1. 表达式的基本认识

表达式 = 能算出值的任何一段代码。

每个表达式的计算都产生一个结果——数字、真假值、或者字符串。

java
// 这些都叫表达式:
42                  // 最简单的表达式——值就是 42
10 + 5              // 13
age > 18            // true 或 false
"你好" + "世界"     // "你好世界"

表达式可以嵌套:(3 + 5) * 2 里面就包含了 3 + 5 这个子表达式。

操作符是干什么的

操作符就是"动作指令"——告诉计算机怎么处理两边的值。

java
int sum = quantity * unitPrice * (1 + TAX_RATE);
//          ↑          ↑           ↑      ↑
//        乘法        乘法        加法   括号——先算

2. 算术操作符

四则运算

java
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)
    }
}

💥 拆了它:分清整数除法和浮点数除法

java
// 运行这段,猜猜每行输出什么
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

规则:两个整数相除 = 整数除法(去尾)。只要有一个是小数 = 浮点数除法(精确)。

取余操作符 %

你可能不熟 %(取余/取模)。它算的是"除法剩下的零头"。

java
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)

实际用途(你很快就会遇到):

java
// 判断奇偶
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. 关系操作符——比大小

关系操作符用来比较两个值,结果永远是 booleantruefalse)。

java
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

⚠️ 新手必犯错误:=== 搞混

java
int x = 5;
// 你想判断 x 是否等于 5
if (x = 5) {     // ❌ 这行编译都过不去!
}

=赋值==判断相等。两个完全不同的东西。

java
// 正确写法
if (x == 5) {    // ✅ 判断 x 是否等于 5
}

4. 逻辑操作符——组合判断

用来组合多个布尔表达式。

java
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)

把它们用到实际场景:

java
int age = 20;
boolean hasID = true;

// 进网吧需要:年满 18 且带了身份证
boolean canEnter = age >= 18 && hasID;  // true

💥 拆了它:短路特性

Java 的逻辑操作符有"短路"行为——如果左边已经能确定结果,右边就不算了。

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不成立时报错。

java
// 安全写法:先检查 name 不是 null,再调 length()
String name = null;
if (name != null && name.length() > 0) {  // name != null 是 false → 短路,不调 length()
    System.out.println("有名字");
}

5. 字符串拼接:+ 的世界

Java 里 + 不仅能做加法,还能拼接字符串。这可能是你最常用的操作之一。

java
System.out.println("你好" + "世界");    // "你好世界"
System.out.println("结果:" + 42);      // "结果:42"
System.out.println(10 + " 个苹果");     // "10 个苹果"
System.out.println("总价:" + (5 + 3)); // "总价:8"

规则:当 + 两边至少有一个是 String 时,Java 把它当拼接用——把另一边也转成字符串。

💥 拆了它:拼接顺序陷阱

java
System.out.println(10 + 20 + " 个苹果");  // ?
System.out.println("苹果: " + 10 + 20);   // ?

结果:

30 个苹果      ← 10 + 20 先做算术加法(两个 int),再拼字符串
苹果: 1020     ← "苹果: " + 10 先拼出 "苹果: 10",再拼 "20"

Java 从左到右计算。 遇到 String 之后,后面的 + 全变成拼接。


6. 赋值操作符

基本赋值

java
int x = 10;   // 把 10 赋给 x

复合赋值

java
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 = 0

x += 5x = x + 5 少打几个字,而且语义更清晰——"给 x 加 5"。

自增自减

java
int count = 0;
count++;   // count = count + 1 → 1
count--;   // count = count - 1 → 0

💥 拆了它:前缀和后缀的区别

java
int a = 5;
System.out.println(a++);  // 输出 5,然后 a 变成 6(先取值,后加1)

int b = 5;
System.out.println(++b);  // b 先变成 6,然后输出 6(先加1,后取值)
java
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 的表达式也有计算顺序。

记忆口诀:先乘除后加减,有括号先算括号

java
int result = 10 + 5 * 2;   // 10 + 10 = 20(乘法优先)
int result2 = (10 + 5) * 2; // 15 * 2 = 30(括号优先)

优先级简表(从高到低)

优先级操作符描述
最高()括号
++ --自增自减
* / %乘除取余
+ -加减
< > >= <=关系比较
== !=相等判断
&&逻辑与
最低||逻辑或

🧪 动手试试

不用跑代码,先在脑子里算每行的结果:

java
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. 完整例子:奶茶店结账系统

java
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 的输出末尾有个奇怪的 53.3333333333333335)? A: 浮点数精度问题。有些小数(比如 1/3)用二进制无法精确表示,只能在有限精度下近似。double 保证约 15 位有效数字的精度,最后一位是误差。这会在第9章细讲。

Q: ? : 是什么? A: 三元操作符。条件 ? 值1 : 值2 —— 条件为 true 取左边,false 取右边。是 if-else 的简洁版,适合简单的二选一赋值。


你现在学会的东西

  1. 表达式 = 能算出值的代码片段
  2. + - * / % — 算术,"两个整数相除结果取整"
  3. > >= < <= == != — 比较,结果永远是 true/false
  4. && || ! — 逻辑组合,&& 优先于 ||
  5. = 是赋值,== 是判断 — 两者不一样
  6. 先乘除后加减,括号优先
  7. 短路特性:够用就停
  8. + 遇字符串变拼接,但注意顺序


✅ 验收标准

完成本章后,你应该能:

  • [ ] 区分 ===,分别说出它们的作用
  • [ ] 解释 5 / 2 为什么等于 2 而不是 2.5
  • [ ] 正确使用 &&|| 编写条件组合
  • [ ] 解释 "结果: " + 5 + 3 为什么输出 结果: 53
  • [ ] 写出 ++countcount++ 的语义区别

📌 常见卡点

  • 整数除法丢小数——想让结果带小数至少一个操作数是 double
  • `=` 赋值 vs `==` 相等——新手最常犯的笔误,编译器只会报类型不匹配
  • 字符串拼接优先级——`+` 从左算,碰到字符串就变拼接
  • 浮点数比较——`0.1 + 0.2 == 0.3` 在 Java 里是 false

🔜 现在不需要理解

  • 位运算符 `&`、`|`、`^`、`<<`、`>>`——底层编程才用,初学者跳过
  • `instanceof`——学了面向对象再用
  • 运算符重载——Java 不支持,C++ 支持,以后遇到再了解

🧪 练习

1. 算结果:在不运行代码的情况下,写出下面每个表达式的值:

java
10 + 5 * 2
(10 + 5) * 2
10 / 3 + 2.0
5 > 3 && 2 < 1
"总价:" + 2 + 3

2. 写代码:有三个变量 a=10, b=20, c=30,用关系操作符和逻辑操作符判断 a 是否同时小于 bc

3. 修bug:下面这段代码编译报错,找出原因并修复。

java
if (x = 10) {
    System.out.println("x 是 10");
}

下一篇

第4章 控制流

用 ❤️ 构建 | Software Systems Atlas