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 结构,等价替换。
所以,大家只要了解有这种语法即可。