7.“条件重复”:while 与 do-while 循环
“条件重复”:while 与 do-while 循环
本章导读 (The Hook)
上一章我们学习了 for 循环,它像一个严谨的计步器,非常适合处理“重复 N 次”这样的任务。但生活中的重复,并不总是预先知道次数的。
- 玩游戏时,你会一直打怪,直到你的角色升级为止。你并不知道具体要打多少只。
- 你在 ATM 机取钱,机器会让你一直重新输入密码,直到你输入正确为止。你也不知道具体会输错几次。
对于这类“只要条件满足,就一直重复”的任务,for 循环就显得有点笨拙了。为此,C++ 提供了另一种更灵活的循环结构—— while 循环。
while 的逻辑非常纯粹,就像它的英文意思一样:“当(while)...条件成立时,就做...”。它只关心一件事:当前的“状态”是否满足继续循环的条件。今天,我们不仅要学习 while 循环,还会认识它的一个“孪生兄弟” do-while,并学会两个能在所有循环中使用的“超级指令”:break 和 continue。
专业术语速查表 (Glossary)
点击展开/折叠本章术语表
while循环- 通俗比喻:一个执着的“守门员”。它在每次进入循环体之前,都会检查一下“通行证”(循环条件)。只有“通行证”有效 (
true),才放行。 - 解释:一种循环结构,它在每次迭代开始前检查循环条件。只有当条件为真时,才执行循环体。
- 通俗比喻:一个执着的“守门员”。它在每次进入循环体之前,都会检查一下“通行证”(循环条件)。只有“通行证”有效 (
do-while循环- 通俗比喻:一个“先上车,后补票”的循环。它不管三七二十一,先执行一次循环体,然后再去检查“通行证”。
- 解释:
while循环的一个变体,它在每次迭代结束后检查循环条件,因此循环体至少会被执行一次。
break- 通俗比喻:循环中的“紧急逃生出口”。一旦执行到
break,程序会立刻、无条件地终止并跳出整个循环,不管循环条件是否还满足。 - 解释:一个控制语句,用于立即终止并退出当前所在的循环(
for,while,do-while)或switch语句。
- 通俗比喻:循环中的“紧急逃生出口”。一旦执行到
continue- 通俗比喻:循环中的“跳过本次”按钮。它会立即结束本次循环,并直接跳到下一次循环的判断点。
- 解释:一个控制语句,用于跳过当前循环体中尚未执行的语句,并立即开始下一次迭代。
核心概念讲解 (The Core Concept)
1. while 循环:先判断,再执行
while 循环的结构非常简洁。
语法:
while (循环条件) { // 循环体:只要条件为 true,就一直执行这里的代码 }代码示例:猜数字游戏(简化版)
#include <iostream> using namespace std; int main() { int magicNumber = 7; // 神秘数字 int guess = 0; // 用户猜的数字 cout << "我心里想了一个 1-10 的数字,你猜猜看: "; cin >> guess; // 只要用户猜的数字不等于神秘数字,就一直循环 while (guess != magicNumber) { cout << "猜错了,再试一次: "; cin >> guess; } // 当循环结束时,说明用户一定猜对了 cout << "恭喜你,猜对了!" << endl; return 0; }在这个例子里,我们无法预知用户要猜多少次才能猜对,所以使用
while循环是再合适不过了。
while 循环的“死循环”陷阱
使用 while 循环时,必须确保在循环体内部,有代码能够改变循环条件,让它最终有机会变为 false。```cpp
// 危险的死循环
int i = 0;
while (i < 5) {
cout << "我停不下来!" << endl;
// 错误!i 的值在循环中从未被改变,所以 i < 5 永远为 true!
}
**正确做法**:在循环体内加上 `i++;`,确保条件最终会失效。2. do-while 循环:先执行,再判断
有时候,我们希望某些操作无论如何都至少要执行一次,比如菜单的显示。这时 do-while 就派上用场了。
语法:
do { // 循环体:这里的代码至少会执行一次 } while (循环条件); // 注意!这里有一个分号代码示例:简单的菜单系统
#include <iostream> using namespace std; int main() { int choice; do { // 无论如何,菜单至少要显示一次 cout << "\n--- 菜单 ---" << endl; cout << "1. 开始游戏" << endl; cout << "2. 加载存档" << endl; cout << "3. 退出游戏" << endl; cout << "请输入你的选择: "; cin >> choice; // ... 这里可以根据 choice 做一些事 ... } while (choice != 3); // 只要用户不选 3 (退出),就一直显示菜单 cout << "感谢游玩,再见!" << endl; return 0; }这个程序会反复显示菜单,直到用户输入
3为止。由于菜单逻辑必须先执行一次才能让用户选择,do-while是完美的解决方案。
3. 循环的“超级指令”:break 和 continue
这两个指令为我们提供了在循环内部更精细地控制流程的能力。
break:彻底越狱break用于完全终止循环。一旦遇到break,循环立刻结束。代码示例:寻找第一个能被 7 整除的数
#include <iostream> using namespace std; int main() { cout << "在 1 到 100 中,寻找第一个能被 7 整除的数..." << endl; for (int i = 1; i <= 100; i++) { if (i % 7 == 0) { cout << "找到了!第一个是: " << i << endl; break; // 任务完成,没必要再继续循环了,直接跳出 for 循环 } } return 0; }continue:本次放行continue用于跳过当前这一轮循环中余下的代码,直接开始下一轮。代码示例:打印 1到10 之间所有的奇数
#include <iostream> using namespace std; int main() { cout << "1 到 10 之间的奇数有: "; for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { // 如果 i 是偶数 continue; // 跳过本次循环的剩余部分(下面的 cout) } // 如果程序能走到这里,说明 i 一定是奇数 cout << i << " "; } cout << endl; return 0; }
动手试试 (Try It Yourself!)
密码验证程序
- 设定一个
string类型的密码,比如"123456"。 - 使用
do-while循环,反复提示用户输入密码。 - 只要用户输入的密码不正确,就一直循环。如果正确,就退出循环并打印“密码正确,欢迎使用!”。
- 想一想,为什么这个场景用
do-while比用while更自然?(因为至少要让用户输入一次密码)
- 设定一个
跳过“不吉利”的楼层
- 使用
for循环打印从 1 到 20 的所有楼层号。 - 但是,如果楼层号是 4 或者 14,就不要打印它。
- 使用
if和continue语句来实现这个“跳过”的功能。
- 使用
“防坑”指南与常见错误 (The Pitfalls)
for, while, do-while 的选择
- 当你知道确切的循环次数时,比如“打印100次”、“处理数组中的所有元素”,优先使用
for循环。它的结构最完整,不易出错。 - 当你不确定循环次数,只知道循环的持续条件时,比如“直到用户输入'quit'”、“只要文件没读完”,优先使用
while循环。 - 当你需要循环体至少执行一次时,比如菜单、输入验证,才考虑使用
do-while循环。它的使用场景相对较少。
do-while 结尾的分号
do-while 是 C++ 中少有的、在 } 后面还需要加 ; 的语法结构。...} while (condition);
忘记这个分号是一个非常常见的编译错误。
本章小结 (The Summary)
我们完成了对 C++ 基本“积木”的学习!现在我们掌握了所有核心的控制流工具。
while循环是“先判断、后执行”的循环,适用于未知循环次数但知道持续条件的场景。do-while循环是“先执行、后判断”的循环,能保证循环体至少执行一次。break语句可以像“紧急出口”一样立即终止任何循环。continue语句可以跳过当前轮次,直接进入下一次循环。- 我们必须在
while和do-while循环体内确保循环条件最终能变为false,以避免死循环。
到此为止,我们已经学完了 C++ 语言最核心的语法特性:变量、运算符、判断和循环。你现在已经具备了编写简单但功能完整的程序的能力。这就像你学会了所有的基本乐高积木。
在 Part 3 中,我们将学习如何把这些零散的积木,搭建成更宏伟、更有组织的“结构”,比如数组和函数。准备好,我们要开始建造更酷的东西了!
