while 语句
循环语句(Iteration statement)是控制程序重复执行某个动作的语句。循环语句大致可以分为 while 语句和 for 语句两部分,本节介绍其中最基础的 while 语句。
while 语句可以用于引入循环。它有两种写法,分别称为 while 循环和 do-while 循环。
while 循环
while 循环我们在第一章已经见过了。现在来正式地描述它的写法:
while (条件表达式) 循环语句
执行 while 循环的本质是不断地执行 循环语句
直到 条件表达式
的值为 false
(或者可以隐式转换为 false
)。其中,判断 条件表达式
的值总是发生在执行 循环语句
之前。我们称被循环的那条 循环语句
为循环体。
比如这是一个典型的 while 循环:
while (i < 10)
cout << i++ << endl;
这里循环体是一个输出语句,在输出之后会令 i 递增 1(因为是后缀自增运算符)。如果 int
型变量 i
的初始值为 0
,则整段代码的作用是从小到大输出 0 到 9 这十个数字。整个过程比较简单,这里便不再赘述了。
如果你觉得刚才在输出语句中递增的这种写法很别扭的话,没关系这很正常;你只需要分成两条语句就可以。所以,如果想要在循环体中执行多余一条的语句,需要用复合语句包起来。这便是我们第一章见过的带大括号的那种形式了:
请尝试自己描述这段代码的运行效果。实际编译运行一下,看看你想得对不对。
你可能在第一章习题中尝试了如何写一个死循环,即永远执行下去的循环。实现方法很简单,只需让条件表达式恒为 true
即可:
还有需要注意的一点是,如果 while 语句的条件最初就不成立(即条件表达式为 false
),那么循环体一次也不会被执行。这是因为对条件表达式的求值总是发生在执行循环体之前的缘故。比如以下代码:
不会有任何输出。
do-while 循环
do-while 循环和 while 循环很相似。先来看一下它的写法:
do 循环语句 while (条件表达式);
相比 while 循环,do-while 循环首先是一个 do,然后循环语句放在了 while 的前面,最后还多了一个分号。那么 do-while 的执行效果是什么呢?本质上仍然是不断地执行 循环语句
直到 条件表达式
的值为 false
(或者可以隐式转换为 false
)。但是,判断 条件表达式
的值总是发生在执行 循环语句
之后。同样地,称被循环的那条 循环语句
为循环体。
所以说 do-while 循环和 while 循环的区别就在于判断条件的时机不同。因此,do-while 的循环体无论如何都会被执行至少一次:
即便条件恒假,仍然会输出一次 Hello, world!
。
第一章结尾的“猜数游戏”可以使用 do-while 循环:
#include <iostream>
using namespace std;
int main() {
int ans{42};
int x{0};
do {
cin >> x;
if (x > ans) {
cout << "That's bigger than the answer. Try again?" << endl;
}
if (x < ans) {
cout << "That's smaller than the answer. Try again?" << endl;
}
} while (x != ans);
cout << "Bingo! You got the answer!" << endl;
}
相比 while 循环,可以减少一行输入语句。
do-while 另外一个常见的用途是“输出一个整数的每一位”:
这里运用了模运算来取出整型变量 x
的最低位,用复合赋值运算来“删除” x
的最低位。除此之外,还利用了整型到布尔类型的隐式转换从而保证循环能够刚好终止。这里不再展开说明这段代码如何工作,感兴趣的读者可以自行研究。
我们用 while 语句的图示来结束本节的内容:
开始 while (条件) 循环体 结束 |
开始 do 循环体 while (条件); 结束 |