C++ 的 while 循环详解

一句话:while 循环在条件为真时重复执行循环体,每圈之前检查。它是"我还不知道要循环几次"的循环 — 其他场合都是换了马甲的 for。

while 循环有三个组成部分,只有第一个写进语法:

  1. 条件 — 每圈前检查;为假即结束。
  2. 循环体 — 干活的部分。
  3. 更新 — 循环体里必须有东西推动世界走向"条件变假"。忘了它就是死循环。

倒计时:最简示例

#include <iostream>
using namespace std;

int main() {
    int n = 5;
    while (n > 0) {
        cout << n << " ";
        n--;               // 更新 — 删掉它就永远循环
    }
    cout << endl;
    return 0;
}

闪光的场合 #1:啃数字

不知道一个数有几位时,for 别扭、while 自然。下面求 12345 的各位和(数字之和题的完整模式):

#include <iostream>
using namespace std;

int main() {
    int n = 12345;
    int sum = 0;
    while (n > 0) {
        sum += n % 10;   // 末位
        n /= 10;         // 切掉它 — 为什么 12345/10 是 1234,
                         // 见整数除法指南
    }
    cout << sum << endl; // 15
    return 0;
}

闪光的场合 #2:读到哨兵为止

读数字直到用户输入 0。次数未知 — while 的地盘(数字放输入框):

#include <iostream>
using namespace std;

int main() {
    int x, sum = 0;
    cin >> x;
    while (x != 0) {
        sum += x;
        cin >> x;        // 在循环里面再读
    }
    cout << "sum = " << sum << endl;
    return 0;
}

更漂亮的变体直接拿"读取"本身当条件 — cin >> x 求值为流对象,读取持续成功时它就是真,于是循环在输入结束或读坏时停下:

#include <iostream>
using namespace std;

int main() {
    int x, sum = 0;
    while (cin >> x) {   // 读取成功就一直循环
        sum += x;
    }
    cout << "sum = " << sum << endl;
    return 0;
}

死循环解剖

int n = 5;
while (n > 0) {
    cout << n << " ";
    // 忘了 n--;   → 条件永远为真
}

三种经典成因:没更新;更新跳过了出口(n-- 从 5 出发却测 n == 0);读取发生在循环外。在本站,失控循环会卡死浏览器标签页(代码在你设备上跑)— 点运行前检查一眼更新那一行。break; 是紧急出口,但只能靠 break 逃出去的循环通常是设计问题。

常见新手 bug

while 相关面试题

  1. "什么时候选 while 不选 for?" — 事先不知道迭代次数:哨兵读入、数字处理、等待条件。
  2. "while (cin >> x) 什么意思?" — 读取持续成功时流为真;输入结束或非法输入结束循环。
  3. "while 和 do-while 的区别?" — do-while 在循环体之后查条件,所以至少跑一次(菜单、输入校验)。
  4. "怎么调试死循环?" — 每圈打印循环变量;那个永远不动的变量就是你缺的更新。

练起来

题库里这些是 while 的主场:数一数位数、数字之和、素数判断。配套阅读:for 与 while 并排对比。