📄 一句话概括
结构化编程的目标很朴素:让程序从上往下读得下去——goto 版 6 行 2 处跳转,while 版 3 行 0 处。
📝 本节和前面几节的关系
3.4 让程序员有余力想结构,这一节讲结构本身。
一、先崩的是人不是机器
高级语言让写程序变容易,于是程序变大了。 程序一大,机器照样跑,人却读不动了。 结构化编程要解决的就是这个:不是让程序更快,是让人读得下去。
二、两种写法
把 1 加到 10,goto 版要6 行、2 处跳转、2 个标签。
while 版要3 行、0 处跳转、0 个标签。
实测:行数少了 3 行,更重要的是跳转没了。
没有跳转,读代码的人就不必满屏找 L1 在哪、L2 又从哪来。
三、阅读顺序=执行顺序
这就是【易懂】的全部含义:从上往下读,就是它跑的顺序。 一旦有 goto,这两件事就分家了——你必须模拟执行才能知道流程。 Dijkstra 那篇著名文章说的就是这个:GOTO 让程序的文本结构失去意义。
四、三种结构
顺序、选择、循环——三种结构各自只有一个入口一个出口。 随便怎么嵌套都不乱,因为每个块的进出点都是明确的。 这就是结构化编程的全部内容,听着简单,但它是后面一切的地基: OOP 的【方法】就是一结构化的小块,类的【接口】也是同样思路的延伸。
五、动手 Demo:重视易懂性的结构化编程
同一段【1 加到 10】,goto 版和 while 版各写一遍。 逐行数一数:行数、跳转数、标签数。
goto_src = [
"i = 0; s = 0",
"L1:",
"if i > 10 goto L2",
"s = s + i; i = i + 1",
"goto L1",
"L2:",
]
while_src = ["i = s = 0", "while i <= 10:", " s += i; i += 1"]
for name, src in (("goto", goto_src), ("while", while_src)):
jumps = sum(1 for s in src if "goto" in s)
labels = sum(1 for s in src if s.endswith(":") and " " not in s)
print(name, "行", len(src), "跳转", jumps, "标签", labels)
实跑输出:
--------------------------------------------------------------------
重视易懂性的结构化编程
--------------------------------------------------------------------
程序一大,最先崩的不是性能,是**人看不懂**。
**结构化编程的目标很朴素:让程序从上往下读得下去。**
拿一段【把 1 到 10 加起来】看两种写法:
i = 0; s = 0
L1:
if i > 10 goto L2
s = s + i; i = i + 1
goto L1
L2:
while 版:
i = s = 0
while i <= 10:
s += i; i += 1
实测:**goto 版 6 行、跳转 2 处;while 版 3 行、跳转 0 处。**
**行数少了 3 行,更重要的是【跳转没了】。**
没有跳转,读代码的人就不必满屏找 `L1` 在哪、`L2` 又从哪来。
**阅读顺序=执行顺序**,这就是【易懂】的全部含义。
所以结构化的三条规矩其实是同一件事:
**顺序、选择、循环**——三种结构各自只有一个入口一个出口,**随便怎么嵌套都不乱。**
实测:goto 版 6 行、2 处跳转、2 个标签;while 版 3 行、两栏都是 0。 行数少了 3 行,更重要的是跳转没了——阅读顺序终于等于执行顺序。
30 秒实验
- 找一段带
break/continue的循环,看看算不算【温和的 goto】。 - 把一个嵌套三层的 if 改写成提前返回,感受一下可读性的差别。
常见误区
- 以为结构化是为了性能。它只为人读得懂。
- 以为没有 goto 就没有跳转。break、continue、异常都是跳转。
自测三问(点开对答案)
1. 结构化编程要解决什么问题? —— 程序变大之后人读不动的问题——让阅读顺序等于执行顺序。 2. goto 版和 while 版各是什么指标? —— goto 版 6 行 2 处跳转 2 个标签;while 版 3 行 0 跳转 0 标签。 3. 三种基本结构是什么? —— 顺序、选择、循环,各自只有一个入口一个出口,随便怎么嵌套都不乱。- ☐ 下一节(3.6 提高子程序的独立性,强化可维护性)
相关笔记
- 实现无GOTO编程的结构化语言 — 这条规矩的正面规定
- 高级语言使程序更加接近人类语言 — 为什么程序会变大
- ⌨️ 编程原理 · 索引 — 控制结构的基础
- 🧩 面向对象是怎样工作的 · 索引