C++ for 与 while:用哪个、何时用?

一句话:知道要循环多少次(或在走一个计数器)用 for;循环到某件事发生、事先数不出来用 while。技术上两者都能干对方的活 — 选择的意义在于可读性。

for 循环:数东西

for 的表头有三段 — 起点;继续条件;步进 — "做这件事 10 次"一眼可见:

#include <iostream>
using namespace std;

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        sum += i;
    }
    cout << "1 + 2 + ... + 10 = " << sum << endl;
    return 0;
}

读出来是:从 i = 1 开始;只要 i <= 10 就继续;每圈之后 i++。变量 i 只活在循环里 — 循环外用它会编译报错,这是好事。

while 循环:直到某事发生

while 只有条件。经典用法:一直读输入直到遇到停止值("哨兵")。往输入框里放几个数 — 那个 0 会停住循环:

#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;
}

注意结构:循环前读一次,循环底部再读一次。非常常见的新手 bug 是忘了第二次读入 — 循环从此无限。

do-while:至少跑一次

条件在循环体之后检查,所以循环体至少执行一次 — 适合菜单和"问到合法为止":

#include <iostream>
using namespace std;

int main() {
    int n = 3;
    do {
        cout << "countdown: " << n << endl;
        n--;
    } while (n > 0);
    cout << "liftoff" << endl;
    return 0;
}

break 与 continue

break 立刻退出循环;continue 跳过本轮剩余部分,进入下一圈:

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 10; i++) {
        if (i % 2 == 0) continue;  // 跳过偶数
        if (i > 7) break;          // 过了 7 就停
        cout << i << " ";
    }
    cout << endl;
    return 0;
}

并排对比

forwhiledo-while
条件检查每圈之前每圈之前每圈之后
最少跑几次001
适合已知次数、计数器未知次数、"直到事件"菜单、输入校验

经典 bug(背下来,省几小时)

面试经典:FizzBuzz

初级筛选常考 — 它考的其实是循环、% 和 if/else 的顺序。规则:3 的倍数打 "Fizz",5 的倍数打 "Buzz",两者都是打 "FizzBuzz",否则打数字:

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 15; i++) {
        if (i % 15 == 0)      cout << "FizzBuzz";
        else if (i % 3 == 0)  cout << "Fizz";
        else if (i % 5 == 0)  cout << "Buzz";
        else                  cout << i;
        cout << " ";
    }
    cout << endl;
    return 0;
}

陷阱:先查 i % 3 的话,15 会打出 "Fizz",永远轮不到 "FizzBuzz" — 顺序就是考点。如果 15 % 3 为什么是 0、% 遇到负数会怎样还不清楚,请看整数除法指南。

练习

  1. 用 for 循环打印 5 的乘法表(1×5 到 10×5)。
  2. 改用 while 再写一遍 — 输出相同,表头不同。
  3. 读到负数为止,输出平均值(小心:sum / count 会咬你 — 看这里)。

相关:什么是 int main()、初学者面试题清单。