📄 一句话概括
程序里的 = 不是【相等】而是【代入】:把右边的值装进左边的盒子——它有方向;要比【两边相不相等】得用双等号 ==。这一个符号的差别,坑过几乎所有初学者。
📝 本节和前面几节的关系
3-4 说变量是盒子,这一篇把【装盒】的动作讲透:单等号是动作、双等号是疑问。回收 C++ 课 3.1.4 赋值运算符与 3.1.2 关系运算符的两课,这里合流成一篇。
一、数学的等号是陈述,程序的等号是命令
- 数学:
x = 5是一句陈述——x 和 5 是同一个数,永远成立,没有先后; - 程序:
x = 5是一条命令——【取 5,装进 x】,有明确的先后和方向(右先左后)。
所以程序里这句在数学课会被判死刑的话,在这里是合法的:
x = 0
x = x + 1 # 取出 x 的旧值 0,加 1,再装回 x -> x 变成 1
读法:先右边、后左边。x = x + 1 是【计数器加一】的标准写法,每执行一次 x 涨 1。
二、比较运算符:提问的一族
| 运算符 | 意思 | 例子(x=5) | 结果 |
|---|---|---|---|
== |
等于吗 | x == 5 |
True |
!= |
不等于吗 | x != 5 |
False |
> < |
大于/小于吗 | x > 3 |
True |
>= <= |
不小于/不大于吗 | x <= 5 |
True |
比较运算的结果是布尔值(True/False)——正好是 3-2 逻辑运算的原料:if score >= 60 and score < 90。
三、头号大坑:把 == 写成 =
C/C++/Java 里这个笔误是能编译通过的:
if (x = 0) { ... } // 本意 x == 0
x = 0 是赋值,表达式的值是 0——条件永远为假,而且 x 还被顺手改成了 0。语法对、逻辑错,编译器多半不吭声。Python 稍好(条件里不让写 =),但这份警觉要带着:赋值是动作、比较是提问,两副面孔绝不混用。
四、动手 Demo:一个等号之差
score = 75
if score == 100:
print("满分")
else:
print("不是满分")
n = 0
n = n + 1
n = n + 1
print(n) # 2
看到什么算成功:输出 不是满分 和 2。
读结果:第一段用 == 提问(75 等于 100 吗——False);后三行用 = 两次装盒(0 加一再加一得 2)。同一套符号,一个是【问】,一个是【做】。
五、30 秒实验
在 Python 里依次跑 x = 5 和 x == 5:第一条执行后什么都不显示(装盒完成,无声),第二条返回 True(提问得到回答)。有无输出,就是动作与提问的肉眼区别。
六、常见误区
- 【等号两边可以随便换位置】——错。
5 = x在数学里成立,在程序里多数语言直接报错:左边必须是盒子(变量),右边才是值。 - 【
==比较之后会改变变量的值】——错。比较是纯提问,问完不动任何盒子;会改值的只有赋值。 - 【True 和 1 是两种完全无关的东西】——不完全对。在 Python 里
True == 1竟然成立(布尔值是整数的特例)——写代码时别依赖这种巧合,但要知道它存在。
自测三问(点开对答案)
1. **`x = x + 1` 数学上为什么不成立、程序里为什么成立?** 答:数学等号是【两边同时相等】的陈述;程序等号是有方向的命令——先算右边、再装回左边,所以能当计数器。 2. **`if (x = 0)` 这类写法在 C 里为什么危险?** 答:它是赋值不是比较,条件值恒为 0(假)——分支永远不执行,且 x 被悄悄改掉;编译器多数不报错。 3. **比较运算的结果是什么类型?** 答:布尔值 True/False——它接着就能喂给 and/or/not 做逻辑运算。- ☐ 下一节(3-6 保留字、文字、魔法数字)
相关笔记
- 变量、常量 —— 盒子论的上一课
- C++ 3.1.4 · 赋值运算符 —— C 家族赋值的完整规则
- C++ 3.1.2 · 关系运算符 —— 比较一族在 C++ 的写法
- ⌨️ 编程原理 · 索引 —— 全课路线图