1. 什么是循环 #
在今天的课程中,我们来介绍循环。首先,我们来看一下,身边的“循环”。
在科学技术中的“循环”。



2. while #
2.1 while 基本结构 #
在 C++ 中,使用单词 while 表示循环。
while(表达式) // 循环启动的“控制开关”
{
// 表达式为真,则执行“循环体”
}
下面来看一个例子,请分析一下,这个循环什么时候结束呢?
// 从 0 数到 …
int i(0);
while(true)
{
cout << i << " 只羊。" << endl; // 这个程序“失眠”了。
i = i + 1;
}
假如硬件条件允许,这个循环可以连续运行几万年!
这种情况,被称为“死循环”。
所以,循环一般都需要一个特定的退出条件。
换句话说,也就是,循环什么时候应该结束。
2.2 while 退出条件 #
请看下面的代码:
int i(0);
while(true)
{
cout << i << " 只羊。" << endl;
i = i + 1;
if(i > 10)
break; // 退出 语句
}
当 if 内的条件成立时,break 表示退出循环。
现在,请你用之前课程学习的知识分析一下,这个循环退出时,i 的值是多少?
2.3 while 启动条件 #
我们再来看一下 while () 括号内的条件。
- 注意,当条件成立时,循环启动。
#include <iostream>
using namespace std;
int main()
{
cout << "请输入一个整数:" << endl;
int i(0);
cin >> i;
while(i)
{
cout << i << " 只羊。" << endl;
i = i - 1;
}
}
上面的这段程序,有两个奇怪的地方。
- 1. while (i) 中的 i 是一个整数。整数可以作为条件吗?
- 2. 这个 while 没有退出判断,那不是“死循环”了吗?
问题 1 :
- 1. while (i) 中的 i 是一个整数。整数可以作为条件吗?
在 bool 变量一节中,我们提到了 true 对应数值 1,false 对应数值 0。
因为“自动类型转换(将在后续讲解)”,这个规则有如下的变化。
// 原始规则 1 对应 true; 0 对应 false; // 受到“自动类型转换”的影响 大于等于 1 的所有整数, 对应 true; // 但是,这并不意味上述的规则失效了。请注意。 小于等于 0 的所有整数, 对应 false;
所以,假如输入 10,则 while(i) 处于条件成立的状态。循环也就启动了。
问题 2 :
- 2. 这个 while 没有退出判断,那不是“死循环”了吗?
在 while 循环中,每次循环前,此条件都会被检查一次。如果条件成立,则执行一次。
所以,条件既可以作为循环的启动条件,也可以作为循环的终止条件。
在这个例程中,当 i 变为 0 时,由于受到“自动类型转换”的影响,
条件不再成立。循环终止。
思考:
假如输入 10 ,上述的循环将执行多少次?
(答案是 10 次)
2. ++ 和 — 符号 #
#include <iostream>
using namespace std;
int main()
{
int i(0);
while(true)
{
cout << i << endl;
i = i + 1;
if(i <= 20)
break;
}
return 0;
}
这个循环可以执行 20 次。
其中,可以这样改写:
#include <iostream>
using namespace std;
int main()
{
int i(0);
while(true)
{
cout << i << endl;
i++; // 新语法,表示 i = i + 1;
if(i <= 20)
break;
}
return 0;
}
i++ 这种写法,可以提高书写的效率,是一种很常用的写法。
除此以外,还可以这样改写:
#include <iostream>
using namespace std;
int main()
{
int i(20);
while(i--) // 新语法,表示 i = i - 1;
{
cout << i << endl;
}
return 0;
}
小结:
i++; // 等价于 i = i + 1; i--; // 等价于 i = i - 1;
3. 循环嵌套 #
while 循环的嵌套比较容易,请看示例程序:
#include <iostream>
using namespace std;
int main()
{
int i(0), s(0);
while(i < 100)
{
int j(0);
while(j < 100) // 在 while 内,嵌套一个 while
{
j++;
s++;
}
i++;
}
cout << "i = " << i << endl; // 请问 i 的值是多少?
cout << "s = " << s << endl; // 请问 s 的值是多少?
return 0;
}
答案:
i=100; s=10000;
循环的嵌套,也是一种很典型的程序结构。
举一个很典型的应用场景:写作文。

作文是从左往右,一行一行写的,所以可以描述为下面的过程:
1. 写第一行
写第 1 个格子;
写第 2 个格子;
写第 3 个格子;
写第 4 个格子;
...
写第 9 个格子;// 假设一行是9个格子
2. 写第二行
写第 1 个格子;
写第 2 个格子;
写第 3 个格子;
写第 4 个格子;
...
写第 9 个格子;// 假设一行是9个格子
3. 写第三行
写第 1 个格子;
写第 2 个格子;
写第 3 个格子;
写第 4 个格子;
...
写第 9 个格子;// 假设一行是9个格子
...
用 while 的嵌套可以这样描述:
int j(0);
while(j < 100)
{
j++; // 移动到下一行
int i(0);
while(i < 10)
{
i++; // 移动到下一个格子
写一个字;
}
}
4. do … while() #
现在介绍一种新的循环结构:do … while()
do
{
…
} while (条件);
它的执行顺序为:
执行循环体;
检查条件是否成立;
成立则继续步骤1,否则退出;
注意,最后有分号!
请判断下面程序的输出:
int dashima(0);
do
{
a++;
} while (a < 10);
cout << a;
这里的输出应该是 a = 10
绝大多数的情况下,do … while 都可以被 while 或者 for 结构,等价替换。
所以,大家只要了解有这种语法即可。