☕ 第二章 Java编程基础

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

取余看着不起眼,实际是高频工具:

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 装进 a
  • a == 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. 优先级与括号:拿不准就加括号

运算符有先算后算的顺序(乘除余 > 加减 > 比较 > 逻辑 > 赋值),但别背优先级表——两个办法解决一切:

  1. 小括号优先级最高,拿不准就加:(a + b) * c
  2. 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(注意外层括号!)
    }
}
⚠️ 第 2 步注意

System.out.println("判断:" + a > b); 会直接编译报错——+ 先把 a 和 "判断:" 拼成字符串,字符串没法和 b 比较。这就是优先级的活教材:拼接和比较抢同一个 + 位置时,用括号表态。

第 3 步:绿三角 ▶ 运行,对照注释核对 5 行输出,全对就过。

第 4 步(30 秒实验):把 a / b 改成 (double) a / b,再跑一次,看小数怎么出来的。


7. 常见误区小结

⚠️ 误区 1:整数除法是四舍五入

不是。是直接砍掉小数(向零取整):10 / 3 = 3,-10 / 3 = -3。

⚠️ 误区 2:`"5" + 3` 是 8

是 "53"。一边是字符串,+ 就变拼接。

⚠️ 误区 3:`a++` 和 `++a` 随便换

单独一行随便换;塞进表达式里结果不同(先用旧值 vs 先加再用)。

⚠️ 误区 4:`&` 和 `&&` 一回事

结果多数时候一样,但 && 会短路(左边定了就不看右边)。初学一律用 &&。

⚠️ 误区 5:比较字符串用 `==`

暂时记住"字符串比较用 equals()",原理第三章挖。


8. 自测题

❓ Q1:`System.out.println(7 / 2);` 和 `System.out.println(7 % 2);` 各输出什么?

7 / 2 输出 3(整数除法砍掉小数);7 % 2 输出 1(7 ÷ 2 商 3 余 1)。顺便:n % 2 == 1 就是"n 是奇数"的判断。

❓ Q2:`System.out.println("总分:" + 60 + 40);` 输出什么?为什么?

总分:6040。从左到右:先 "总分:" + 60 拼成字符串 "总分:60",再和 40 拼成 "总分:6040"。想算加法得写 "总分:" + (60 + 40)。

❓ Q3:`a = 5` 之后,`System.out.println(a++ + ++a);` 输出什么?(挑战题)

12。拆开看:a++ 先用旧值 5(a 变 6),++a 先加 1 变 7 再用,5 + 7 = 12。能独立算对说明前缀后缀真懂了——但实际写代码别这么玩。

❓ Q4:`byte b = 10;` 然后 `b = b + 1;` 和 `b += 1;` 哪个报错?为什么?

b = b + 1 报错:b+1 提升为 int,int 装不回 byte 格子。b += 1 不报错:扩展赋值自带强制转换。这就是"+= 不完全等于展开写"的原因。

❓ Q5:`int score = 85;` 写一个表达式判断"分数在 60 到 100 之间(含两端)",结果存进 boolean。

boolean ok = score >= 60 && score <= 100;(true)。注意别写成数学式的 60 <= score <= 100——Java 不认,会比较完 boolean 再和数字比,直接编译错。


9. 下一步学什么


10. 相关笔记