在实际编程中,我们经常需要让计算机重复做同一件事。比如把 1 到 100 的整数加起来,总不能手动写 100 行加法代码,对吧?C++ 提供了 “循环语句”,只要指定的条件成立,就能自动反复执行同一段代码。
在 C++ 中,循环语句共有 3 种:① while 循环;② do...while 循环;③ for 循环。这一节我们先来学习最基础的 while 循环。
C++ while 循环语法
while 在英文中是 “当……的时候” 的意思。在 C++ 中,while 循环表示:只要指定的条件成立,就一直重复执行花括号里的代码。
语法:
while (条件) {
// 条件为 true 时循环执行的代码
}说明:
程序执行到 while 语句时,会先判断小括号里的 “条件”。如果条件为 true(真),就会进入花括号 {} 执行里面的代码,这部分被重复执行的代码称为 “循环体”。
当执行完一轮 {} 内部的代码后,程序会再次回到 while 的小括号处重新判断条件。如果条件依然为 true,就继续执行下一轮……如此循环往复,直到某一次条件变为 false(假)才结束整个循环,接着往下执行后面的代码。
在使用 while 循环时,小伙伴们需要注意以下 2 点:
- 循环体内部必须包含能让判断条件最终变为
false的更新语句,比如n++,否则循环会一直停不下来。 - 即使循环体内部只有一条语句,也建议统一使用花括号
{}括起来,让代码结构更清晰、更不容易出错。
C++ while 循环示例
下面我们先通过一个简单的计数例子,看看 while 循环是怎么一步步运行的。
示例 1:输出 1 到 5 的整数
#include <iostream>
int main() {
int n = 1;
while (n <= 5) {
std::cout << n << '\n';
n++; // 计数加 1
}
return 0;
}运行结果如下。
1
2
3
4
5分析:
在这个例子中,变量 n 的初始值为 1,判断条件为 n <= 5。在循环体内部,每次先输出当前的 n,然后执行 n++ 让 n 的值加 1。具体执行过程如下:
- 第 1 次判断:
n为 1,满足n <= 5,进入循环输出 1,随后n变为 2。 - 第 2 次判断:
n为 2,满足n <= 5,进入循环输出 2,随后n变为 3。 - 第 3 ~ 5 次判断:依次输出 3、4、5,当第 5 次循环执行完
n++后,n变为 6。 - 第 6 次判断:此时
n为 6,判断条件6 <= 5返回false,直接退出while循环。
由于 while 循环是 “先判断条件,再执行循环体”,如果第一次判断时条件就不成立,比如把上面代码中 n 的初值改成 6,那么花括号里的循环体一次都不会执行。
理清执行顺序后,我们再使用 while 循环来解决一个经典的累加问题:计算 1 到 100 所有整数的和。
示例 2:计算 1 到 100 的整数之和
#include <iostream>
int main() {
int n = 1;
int sum = 0;
while (n <= 100) {
sum += n;
n++;
}
std::cout << "1 + 2 + 3 + ... + 100 = " << sum << '\n';
return 0;
}运行结果如下。
1 + 2 + 3 + ... + 100 = 5050分析:
这里我们定义了两个整型变量:n 用来从 1 递增到 100,sum 用来保存累加的总和。注意在累加开始前,必须先把 sum 初始化为 0。如果只写 int sum; 而不赋初值,内存里会残留随机的垃圾值,算出来的总和就不对了。
在循环体内部,sum += n 等价于 sum = sum + n,用来把每一轮的 n 累加到 sum 中。
第 1 轮把 1 加进 sum 得到 1,第 2 轮再把 2 加进去得到 3……直到第 100 轮加完 100 后,n 自增变为 101。接着进行第 101 次判断时,101 <= 100 返回 false,程序退出循环并输出结果 5050。
提示 计算 1 到 100 的整数之和虽然可以直接套用等差数列求和公式 (1 + 100) * 100 / 2,但这里的重点是掌握循环累加的思路。在实际开发中,统计订单总额、逐行读取数据等任务都没有现成的数学公式,必须借助循环才能完成。
示例 3:计算 100 以内的奇数之和
#include <iostream>
int main() {
int n = 1;
int sum = 0;
while (n < 100) {
sum += n;
n += 2;
}
std::cout << "1 + 3 + 5 + ... + 99 = " << sum << '\n';
return 0;
}运行结果如下。
1 + 3 + 5 + ... + 99 = 2500分析:
n += 2; 表示每一轮循环让 n 的值增加 2,因此 n 会依次取 1、3、5、……、99,跳过所有偶数,把 100 以内的奇数全部累加到 sum 中。
对于这个例子来说,将判断条件 n < 100 改为 n <= 99 得到的结果也是一样的,因为当 n 从 99 加上 2 变成 101 时,这两个条件都会返回 false。同理,示例 2 中的 n <= 100 也等价于 n < 101,小伙伴们可以代入边界值验证一下。
C++ while 死循环
如果 while 小括号里的判断条件一直保持为 true,循环就永远不会自然停止,程序会一直运行下去,这种现象叫做 “死循环”。
示例 4:漏写更新语句导致死循环
#include <iostream>
int main() {
int n = 1;
while (n <= 5) {
std::cout << "欢迎来到绿叶网\n";
}
return 0;
}运行结果如下。
欢迎来到绿叶网
欢迎来到绿叶网
……
欢迎来到绿叶网分析:
这就是初学者最容易写出的一种死循环。由于循环体内部漏写了 n++,变量 n 的值永远停留在 1,条件 n <= 5 始终为 true,屏幕就会不停地打印文字。如果在本地终端运行时遇到死循环,我们可以按下快捷键(Ctrl + C)强制停止程序。
除了漏写更新语句之外,如果在 while (条件) 的小括号后面不小心多加了一个英文分号(;),同样会导致死循环:
int n = 1;
// 正确方式
while (n <= 5) {
std::cout << n << '\n';
n++;
}
// 错误方式
while (n <= 5); {
std::cout << n << '\n';
n++;
}在上面的错误方式中,while (n <= 5); 末尾的分号本身就是一条空语句,相当于循环体里什么也没干,后面的花括号 {} 跟 while 已经没有任何关系了。由于 n 一开始等于 1,在空循环里又不会改变,程序就会一直卡死在 while 这一行。
当然了,在实际开发中,有时我们也会故意写出 while (true),然后在循环体内部配合 break 语句,当满足某个条件时再主动跳出循环。但对于并非故意设计的意外死循环,平时写代码时一定要多加留意避免。
