6.“自动重复”:for 循环
“自动重复”:for 循环
本章导读 (The Hook)
想象一下,体育课上老师要求你绕着操场跑 10 圈。你会怎么做?你肯定不会这样想:
“跑第 1 圈。跑第 2 圈。跑第 3 圈。跑第 4 圈。... 跑第 10 圈。”
你的大脑会自动进入一个“重复模式”:“开始跑圈,数着圈数,只要圈数没到 10,就继续跑,每跑完一圈,圈数就加 1。”
计算机和我们一样,也极其擅长(甚至可以说就是为此而生的)做重复性的工作。如果我想让程序在屏幕上打印 100 次 "你好",难道要我写 100 行 cout 吗?当然不!
为了解决这类问题,C++ 提供了循环 (Loop) 结构。它允许我们定义一段代码,并让计算机按照我们设定的规则,自动地、不知疲倦地重复执行它。
今天,我们来学习最常用、最强大的循环结构—— for 循环。它特别适合用在“我们事先就知道要重复多少次”的场合,就像我们一开始就知道要跑 10 圈一样。
一个让代码更简洁的技巧:using namespace std;
温馨提示:告别 std::
到目前为止,我们每次使用 cout 或 cin,前面都要加上 std::,这就像每次提到“姚明”都要说“中国的篮球运动员姚明”一样,虽然精确,但有点啰嗦。
std 是一个“命名空间 (namespace)”,你可以把它理解成一个“品牌”或“姓氏”。它告诉编译器,我们用的 cout 是那个“标准 (standard)”牌的,而不是其他什么自定义牌子的。
为了简化代码,我们可以在程序的开头,紧跟在 #include 之后,加上一句“魔法咒语”:using namespace std;
这句话的意思是:“接下来,我默认使用的所有工具(如 cout, cin, endl),都来自 std 这个品牌,不用再每次都强调了!”
从本章开始,我们的代码将默认使用这句声明,这样可以让我们更专注于循环本身的逻辑。
#include <iostream>
using namespace std; // 加上这句
int main() {
// 现在可以直接写 cout 和 endl,不用加 std::
cout << "代码变得更清爽了!" << endl;
return 0;
}注意:在大型项目中,直接“打开”整个 std 命名空间有时会带来一些问题(比如命名冲突),但在我们的学习阶段,它能极大地提升代码的可读性和编写效率。现在,请享受告别 std:: 的轻松吧!
专业术语速查表 (Glossary)
点击展开/折叠本章术语表
循环 (Loop)
- 通俗比喻:一段被设定了“重复播放”按钮的代码。
- 解释:一种控制流结构,允许一段代码(循环体)在满足特定条件的情况下被重复执行。
for循环- 通俗比喻:一个高度结构化的“跑步计划”。它在一个地方就明确规定了“从第几圈开始跑”(初始化),“跑到什么时候停”(循环条件),以及“每跑完一圈要做什么”(更新迭代)。
- 解释:一种循环结构,它将循环的初始化、条件判断和迭代更新三个部分集中写在一起,非常适合用于已知循环次数的场景。
循环体 (Loop Body)
- 通俗比喻:“跑步”这个动作本身。也就是被
{}包裹起来,需要被重复执行的那段代码。 - 解释:在循环结构中被重复执行的代码块。
- 通俗比喻:“跑步”这个动作本身。也就是被
初始化 (Initialization)
- 通俗比喻:“从第 0 圈开始计数”。
- 解释:
for循环的第一部分,只在循环开始前执行一次,通常用于声明并初始化一个循环控制变量(计数器)。
循环条件 (Condition)
- 通俗比喻:“圈数还没到 10 圈吗?”
- 解释:
for循环的第二部分,在每次循环开始前都会进行判断。如果条件为true,就执行循环体;如果为false,就退出循环。
更新/迭代 (Update/Iteration)
- 通俗比喻:“跑完一圈后,把计数器加 1”。
- 解释:
for循环的第三部分,在每次循环体执行完毕后执行,通常用于更新循环控制变量的值。
循环控制变量 (Loop Control Variable)
- 通俗比喻:用来记录“当前是第几圈”的那个计数器。
- 解释:一个在循环中被初始化、检查和更新的变量,用于控制循环的执行次数。我们通常把它命名为
i,j,k。
核心概念讲解 (The Core Concept)
1. for 循环的“三驾马车”
for 循环的语法看起来有点复杂,但只要你理解了它的三个核心组成部分,就会变得非常清晰。
语法:
for (初始化; 循环条件; 更新迭代) { // 循环体:需要重复执行的代码 }代码示例:打印 5 次“你好”
#include <iostream> using namespace std; int main() { // (1. 初始化; 2. 循环条件; 4. 更新迭代) for (int i = 0; i < 5; i++) { // 3. 循环体 cout << "你好!这是第 " << i << " 次循环。" << endl; } cout << "循环结束了。" << endl; return 0; }执行流程分解 (按数字顺序):
int i = 0;(初始化): 程序进入for循环,首先执行这句。它创建了一个整数变量i并赋值为0。这个步骤只会执行一次。i < 5;(循环条件): 程序判断i(当前是 0) 是否小于 5。0 < 5是true,所以准备执行循环体。cout << ...(循环体): 执行{}内部的代码,屏幕上打印出 "你好!这是第 0 次循环。"。i++(更新迭代): 循环体执行完毕后,执行这句。i的值从0变成了1。- 回到第 2 步: 程序再次判断
i < 5(现在i是1)。1 < 5仍然是true,继续执行循环体... - 重复 3 和 4: 打印 "你好!这是第 1 次循环。",然后
i变成2。 - ...这个过程不断重复...
- 直到某一次,
i变成了5。程序回到第 2 步判断i < 5。5 < 5是false! - 循环结束: 程序不再执行循环体,直接跳出
for循环,执行后面的cout << "循环结束了。" << endl;。
为什么从 0 开始?
你会发现程序员非常喜欢从 0 开始计数(i = 0 并且条件是 i < 5,正好循环 5 次:0, 1, 2, 3, 4)。这是一种编程约定,与数组(我们后面会学)的索引方式有关。请从现在开始习惯这种计数方式。
动手试试 (Try It Yourself!)
1到100的累加
- 编写一个程序,使用
for循环计算从 1 加到 100 的总和是多少。 - 你需要一个循环外的变量(比如
int sum = 0;)来累积总和。 - 在循环体内部,每一轮都把当前的循环变量
i加到sum上(sum += i;)。 - 循环结束后,打印出最终的
sum。
- 编写一个程序,使用
打印九九乘法表(挑战)
- 这是一个经典的
for循环练习,它需要你使用嵌套循环(一个for循环里面再套一个for循环)。 - 外层循环控制行数(从 1 到 9)。
- 内层循环控制列数(从 1 到 当前行数)。
- 在内层循环中,打印出
j << "*" << i << "=" << i*j这样的表达式。 - 每当外层循环的一轮结束时(也就是一行打印完毕),需要打印一个换行符
endl。
- 这是一个经典的
“防坑”指南与常见错误 (The Pitfalls)
天坑一:循环条件写错导致“死循环”
如果你的循环条件永远为 true,那么这个循环将永不停止,直到你强制关闭程序。这就是死循环。
// 致命的死循环示范
// 条件是 i >= 0, i 初始为 0, 每次都 i++, i 永远都大于等于 0
for (int i = 0; i >= 0; i++) {
cout << "救命!我停不下来了!" << endl;
}如何避免:在写循环条件时,请仔细思考循环的“终点”在哪里,确保循环变量总有一天会达到这个终点,让条件变为 false。
终止方法:使用 Ctrl+C 停止程序。
易错点:在初始化部分搞混
for 循环的第一部分是初始化,只执行一次。不要把应该在循环体内重复执行的代码误写到这里。
// 逻辑错误
int sum = 0;
for (int i = 1; i <= 100; sum += i, i++) {
// 循环体是空的!
}
cout << sum << endl;
// 虽然这段代码语法上可能没错,但把累加操作写在更新部分,
// 极大地降低了代码的可读性。请保持循环体只做它该做的事。最佳实践:保持 for 的三个部分各司其职:初始化变量、检查条件、更新变量。核心逻辑应该清晰地写在循环体 {} 内部。
本章小结 (The Summary)
我们掌握了编程中最强大的能力之一:自动化重复!
- 循环允许我们重复执行一段代码。
for循环特别适合在已知循环次数的场景下使用。for循环的结构由三部分组成:for (初始化; 条件; 更新)。- 我们学会了使用
using namespace std;来简化代码。 - 要警惕写错循环条件导致的死循环。
- 从
0开始计数是一种非常重要的编程习惯。
for 循环是我们解决重复性任务的“瑞士军刀”,但它最适合的是那种“计次”循环。如果我们的循环条件不是基于次数,而是基于某个状态呢?比如,“只要玩家的血量还大于 0,游戏就继续”。对于这种场景,C++ 提供了另一种更灵活的循环。下一章,我们将学习——“条件重复”:while 与 do-while 循环。
