🔷 第五章 循环语句
📄 一句话概括

for 的三段都能省,但两个分号永远在:省初始化(外面已声明)、省更新(搬进循环体)、省条件(永真,必须靠 break 出门)、全省略 for(;;)(死循环的标准写法);初始化和更新段还能用逗号养两个变量。变体不是炫技——每种的适用场景不同,乱混搭才是事故。

📝 本节和前面几节的关系

5.2.1 把三段按编号走了一遍,本篇放开手:"哪段可以不住在括号里"。省略段用的都是老家底:逗号是 3.1.9 逗号运算符,break 是 5.3.2 的主角(这里先打个照面)。

一、变体清单:省哪段,责任搬哪去

变体 写法 后果与条件
省初始化 for (; i <= 10; i++) i 在循环外出生;两处声明会遮蔽,别重复
省更新 for (int i=1; i<=10;) 更新搬进循环体末尾;等价 while
省条件 for (int i=1; ; i++) 条件空 = 永真;体内必须自备 break
全省略 for (;;) "forever":服务程序、游戏主循环的标准姿势,靠 break/return 出门
逗号双变量 for (int i=1, j=10; i<j; i++, j--) 初始化/更新各养两个变量,相向而行

两条铁律(所有变体通用):

  1. 两个分号是语法骨架——for(;;) 什么都没有也要把两个分号立着。
  2. 省了哪段,那段的责任就换地方扛——初始化搬到外面、条件搬进体内(break)、更新搬进循环体;省了却没搬 = 死循环或编译错。

二、最常用的一个:全省略 + break

#include <iostream>
using namespace std;

int main() {
    int sum = 0;
    for (;;) {                 // 永真:出门靠 break
        int x;
        cout << "输入一个数(0 结束):";
        cin >> x;
        if (x == 0) break;     // 出口在这里
        sum += x;
    }
    cout << "总和 = " << sum << endl;
    return 0;
}

看到什么算成功:输入 10 20 30 0 输出 总和 = 60。这个"永真循环 + 条件出口"的写法在真实工程里极常见——结束条件写在循环中间时,比硬塞进 for 括号自然得多。

30 秒实验:把逗号变体跑一遍,循环体里 cout << i << "+" << j << " ";——看到 1+10 2+9 3+8 4+7。再答一题:为什么只打 4 组不是 5 组?——i=5、j=6 时 i<j 还是真(第 5 圈会跑),到 i=6、j=5 才停;在第 5 圈里打印后停下,你数的是"停前圈数"。

三、常见误区

  1. "省条件 = 语法错误"——不报错,而是永真;忘配 break 就是死循环。省略要"省一处、补一处"。
  2. "逗号和分号随便换"——括号里分号分段、逗号并列;for (i=1, i<=10, i++) 是把三个表达式并成一段,类型都对不上,直接编译错。
  3. "变体混着用更灵活"——初始化外面一份、更新体内外各一份……三要素散落四处,读的人要在脑子里拼图。变体选一种收干净,可读性优先。
自测三问(点开对答案) 1. `for(;;)` 为什么合法?——三段可省,两个分号是骨架;条件空即永真。 2. 省条件后怎么防止死循环?——循环体内自备出口(如 `if (...) break;`)。 3. `for (int i=1, j=10; ij=5 为假)。

相关笔记