第16章:控制循环

第16章:控制循环:从“重复执行某段代码”推进到“边界与终止都能推导”,以目录节点、专属机制实验和故障复位验收。

学习目标

  • 选择 while、for、foreach 或带退出的循环,并写出初始化、继续条件与退出后置条件。
  • 用不变量和进展量解释循环体为何终止,区分零次、一次、末端和越界一步的边界行为。
  • 运行正常、边界和故障输入,保存首个偏离、拒绝理由与重置后的同一轨迹。

为什么需要这一机制

第16章:控制循环 解决的不是一个可背诵口号,而是从 重复执行某段代码边界与终止都能推导 的可观察变化。它的核心机制是:循环用初始化、继续条件、不变量、进展量和退出后置条件建立证明,并对零次、一次、末端和越界邻域测试。

学习 第16章:控制循环 时先预测 循环前状态、进入条件、单次不变量、退出条件、循环后状态 的输入与输出,再改变一个直接条件。最终结果即使看似正确,只要中间状态违反合同、故障不能隔离或重置不能回到同一基线,本页结论就不通过。

核心合同

invariantguardprogresspostconditioninvariant\land guard\land progress\Rightarrow postcondition

第16章:控制循环 的合同变量必须绑定到同一版本、同一输入、同一单位和同一观察窗口。先由合同推出预期,再观察 单次不变量 与 循环后状态;如果只是修改阈值来迎合结果,实验失去裁决能力。

目录节点到四级证据

以下节点逐项给出“出现—解释—视觉/实验—练习验证”证据。第16章:控制循环 不把目录词频当作覆盖率;每一项都必须能在专属机制链中指出状态变化,并在章末练习清单中被复核。

第16章 控制循环

第16章:控制循环 中,目录节点 第16章 控制循环 落在“循环前状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 第16章 控制循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。

16.1 选择循环的种类

第16章:控制循环 中,目录节点 16.1 选择循环的种类 落在“进入条件”检查点。这里的技术含义是:用构造和公开操作守住对象不变量,优先组合稳定职责;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 16.1 选择循环的种类 时,尝试绕过接口制造半有效对象,确认不变量不可被外部破坏。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。

什么时候使用while循环

第16章:控制循环 中,目录节点 什么时候使用while循环 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 什么时候使用while循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。

什么时候用带退出的循环

第16章:控制循环 中,目录节点 什么时候用带退出的循环 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 什么时候用带退出的循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。

何时使用for循环

第16章:控制循环 中,目录节点 何时使用for循环 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 何时使用for循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。

何时使用foreach循环

第16章:控制循环 中,目录节点 何时使用foreach循环 落在“循环前状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 何时使用foreach循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。

16.2 循环控制

第16章:控制循环 中,目录节点 16.2 循环控制 落在“进入条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 16.2 循环控制 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。

进入循环

第16章:控制循环 中,目录节点 进入循环 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 进入循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。

处理好循环体

第16章:控制循环 中,目录节点 处理好循环体 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 处理好循环体 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。

退出循环

第16章:控制循环 中,目录节点 退出循环 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 退出循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。

检查端点

第16章:控制循环 中,目录节点 检查端点 落在“循环前状态”检查点。这里的技术含义是:明确角色、准备材料、缺陷分类和修订责任,讨论产物而非个人;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 检查端点 时,让未参与实现者仅凭合同复查并比较独立发现。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。

使用循环变量

第16章:控制循环 中,目录节点 使用循环变量 落在“进入条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 使用循环变量 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。

循环应该有多长

第16章:控制循环 中,目录节点 循环应该有多长 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 循环应该有多长 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。

16.3 轻松创建循环——由内而外

第16章:控制循环 中,目录节点 16.3 轻松创建循环——由内而外 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 16.3 轻松创建循环——由内而外 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。

16.4 循环和数组的关系

第16章:控制循环 中,目录节点 16.4 循环和数组的关系 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 16.4 循环和数组的关系 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。

关键点

第16章:控制循环 中,目录节点 关键点 落在“循环前状态”检查点。这里的技术含义是:把本单元结论改写为带前提、反例和证据位置的决策规则;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。

验证 关键点 时,构造规则不适用的最小反例并说明退出条件。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。

最小可重放实现

# 第16章:控制循环:先建立参考模型,再核对边界
expected = reference_cc2e_16_loops(fixed_input)
actual = run_cc2e_16_loops(fixed_input)
assert actual == expected
assert reset_and_run(fixed_input) == expected

这段 第16章:控制循环 验证草图表达独立教学合同,不复制原书代码。真实执行应保存输入、环境、节点轨迹、最终结果、拒绝理由和复位结果,使第二位读者能从干净状态重放。

专属因果实验

先预测改变“循环种类”或“控制”后,第16章:控制循环 的哪一个节点最先变化。切换基线、边界和注入故障,运行并保存证据;最后点击“重置实验”,确认滑块、场景、节点、压力和结果文字全部恢复。

分步1 / 3

1. 固定循环前状态与循环种类

先猜空集合、单元素和多元素会分别执行几次,再观察初始化与继续条件的关系。

第16章 · 循环合同实验

初始化 → 继续条件 → 循环体 → 进展量 → 退出后状态

先猜首个偏离会发生在哪里,再切换边界或故障,观察循环为何继续、停止或被拒绝。

当前焦点:初始化
循环控制的可证明合同初始化守住起点;继续条件、循环体和进展量共同决定终止1初始化循环前状态2继续条件进入 / 停止3循环体保持不变量4进展量靠近退出5退出后状态可复核结果12345基线:每个元素恰好处理一次,空集合自然得到零次迭代当前代码草图:for (const item of items) { use(item); }审查记录保存:输入 · 零次/一次/末端 · 首个偏离 · 退出后状态 · 重置重放
基线:每个元素恰好处理一次,空集合自然得到零次迭代

第 1 / 5 步 · 先写循环前状态:输入集合、索引起点和必须保持的不变量。

先预测,再用单步或播放核对每个节点;最后重置并用同一输入重放。

红色只表示进展合同被破坏;修复的标准是边界、终止和复位后的轨迹都能被另一位读者复算。

故障诊断与误区

术语与边界

第16章:控制循环 的六个操作术语是 。每个术语都能指向实验控件、节点或状态文本;若只能指向目录标题,说明解释和验证仍未完成。

本页小结

第16章:控制循环 的完成标准是能解释“循环用初始化、继续条件、不变量、进展量和退出后置条件建立证明,并对零次、一次、末端和越界邻域测试”,用核心合同推出预期,沿五个专属节点观察实际,诊断“索引与集合长度错一位,或循环体不保证向退出条件推进”,并证明复位后同一输入重建基线轨迹。

名词解释

本章出现的专业名词,用大白话再讲一遍。

循环前状态

进入第一次判断前已经确定的输入集合、索引起点、资源和版本;它是重放实验的基线。

循环不变量

每次迭代前后都必须成立的条件,例如索引始终落在已处理前缀之后且不超过集合长度。

继续条件

决定循环体是否再次执行的判断;它必须说明零次执行和边界停止的结果。

进展量

每次迭代都会改变、并且朝退出条件移动的量,如索引递增或剩余任务减少。

循环后状态

退出时可检查的结果,包括最终索引、已处理数据和后置条件,而不是一句“循环结束了”。

端点

空集合、单元素、最后一个合法值和越界一步等最容易揭示边界错误的输入位置。

练习

  1. 对空集合、单元素集合和三元素集合,分别写出 for (i = 0; i < items.length; i += 1) 的迭代次数、最后一次合法索引和退出时的 i。说明这组样本怎样验证循环不变量。
  1. 找出 while (i < items.length) { use(items[i]); } 的最小故障,并给出只改变必要状态的修法。需要保存什么证据才能证明不是靠改阈值蒙对?
  1. 为“选择循环的种类、循环控制、由内而外、循环和数组的关系”建立四级证据清单:每项各写一个解释、一个实验节点和一个可重放练习。

讨论

评论区加载中…