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;
}
并排对比
| for | while | do-while | |
|---|---|---|---|
| 条件检查 | 每圈之前 | 每圈之前 | 每圈之后 |
| 最少跑几次 | 0 | 0 | 1 |
| 适合 | 已知次数、计数器 | 未知次数、"直到事件" | 菜单、输入校验 |
经典 bug(背下来,省几小时)
- 表头后面跟分号:
for (int i = 0; i < 10; i++);— 那个多出来的;是空循环体,循环空转十次。while (...);同理。 - 差一错误:
i <= 10跑 1..10 共 10 圈;i < 10跑 9 圈。哪个都不"错" — 但要刻意选,调试时检查边界。 - 死循环:忘了
i++,或改了循环里的变量却忘了重新读输入。本站特别提醒:练习场跑在你的浏览器里,失控的循环会把标签页卡住,直到你关掉它 — 点运行前再检查一眼步进。 - 在 for 循环体里改计数器 — 合法但坑人;循环体一改
i,表头就在对读者撒谎。
面试经典: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、% 遇到负数会怎样还不清楚,请看整数除法指南。
练习
- 用
for循环打印 5 的乘法表(1×5 到 10×5)。 - 改用
while再写一遍 — 输出相同,表头不同。 - 读到负数为止,输出平均值(小心:
sum / count会咬你 — 看这里)。