C++ 第7课 while 循环

上一课标准答案:

  1. 输出 20
  2. 输出 3
  3. break; 的作用:执行完当前 case 后,退出这个 switch,避免继续执行下面的其他 case
  4. A 更适合 if;B 更适合 switch

最重要的是记住:

复制代码
if      更适合范围、大小、复杂条件判断
switch  更适合同一个变量对应多个固定值

第 7 课:while 循环

前面我们的程序基本都是:

一条语句执行一次。

但机器人控制绝大多数时候不是"只检查一次"。

例如机械臂可能需要:

只要还没到目标位置,就继续运动。

或者:

只要程序还在运行,就不断读取传感器。

这种"重复执行"就叫:

循环

今天先只学最简单的:

复制代码
while

1. 什么是 while

基本格式:

复制代码
while (条件)
{
    重复执行的代码
}

while 可以直接理解成:

只要......就一直......

例如:

复制代码
while (条件成立)
{
    一直执行这里
}

2. 最简单的例子

看:

复制代码
int a = 0;

while (a < 3)
{
    std::cout << a << std::endl;
    a++;
}

这个程序很重要,我们一步一步走。

一开始:

复制代码
a = 0

然后判断:

复制代码
a < 3

也就是:

复制代码
0 < 3

成立。

所以进入循环。


第 1 次循环

执行:

复制代码
std::cout << a << std::endl;

输出:

复制代码
0

然后:

复制代码
a++;

所以:

复制代码
a = 1

回到 while

注意这里:

执行完花括号,不是直接往下走。

而是重新回到:

复制代码
while (a < 3)

再次判断。

现在:

复制代码
a = 1

判断:

复制代码
1 < 3

成立。

进入第 2 次循环。


第 2 次循环

输出:

复制代码
1

然后:

复制代码
a++;

变成:

复制代码
a = 2

第 3 次

重新判断:

复制代码
2 < 3

成立。

输出:

复制代码
2

然后:

复制代码
a = 3

第 4 次检查

重新判断:

复制代码
3 < 3

结果:

复制代码
false

循环结束。

所以最终输出:

复制代码
0
1
2

3. while 的核心流程

可以画成:

复制代码
        判断条件
           │
     ┌─────┴─────┐
     │           │
   true        false
     │           │
     ▼           ▼
执行循环体      退出循环
     │
     └─────────────→ 回去重新判断

所以 while 不是:

判断一次。

而是:

判断 → 执行 → 再判断 → 再执行......

直到条件变成 false。


4. 为什么一定要有 a++

看刚才:

复制代码
int a = 0;

while (a < 3)
{
    std::cout << a << std::endl;
    a++;
}

这里的:

复制代码
a++;

非常重要。

因为它让:

复制代码
a
0 → 1 → 2 → 3

最终导致:

复制代码
a < 3

变成 false。

循环才能结束。


5. 如果忘了 a++ 会怎么样?

看:

复制代码
int a = 0;

while (a < 3)
{
    std::cout << a << std::endl;
}

一开始:

复制代码
a = 0

判断:

复制代码
0 < 3

成立。

输出:

复制代码
0

但是 a 完全没有变化。

所以再回来:

复制代码
0 < 3

还是成立。

继续输出:

复制代码
0

然后又回来......

于是:

复制代码
0
0
0
0
0
0
0
......

会一直运行下去。

这叫:

死循环 / 无限循环


6. 为什么叫"死循环"?

因为退出条件永远不会出现。

例如:

复制代码
while (a < 3)

想退出,最终必须让:

复制代码
a >= 3

但是如果 a 永远都是 0,就永远退出不了。

所以以后你看到循环,要问自己一个非常重要的问题:

什么东西会改变,让这个条件最终变成 false?

这是检查循环代码非常重要的习惯。


7. 机器人例子:不断靠近目标

现在开始往机械臂靠。

假设当前关节角度:

复制代码
double current_angle = 0.0;

目标角度:

复制代码
double target_angle = 5.0;

我们先做一个非常简化的模拟:

复制代码
while (current_angle < target_angle)
{
    current_angle += 1.0;

    std::cout << current_angle << std::endl;
}

执行过程:

复制代码
current_angle = 0

判断:

复制代码
0 < 5

成立。

然后:

复制代码
current_angle += 1.0;

变成:

复制代码
1

继续。

最后输出大概是:

复制代码
1
2
3
4
5

当:

复制代码
current_angle = 5

再判断:

复制代码
5 < 5

为 false。

循环结束。


8. 这已经有"控制"的味道了

当然真实机械臂不会这样简单写:

复制代码
current_angle += 1.0;

真实情况可能是:

复制代码
发送电机控制命令
↓
电机运动
↓
读取编码器
↓
得到新的 current_angle
↓
重新判断

也就是说真实控制逻辑更像:

复制代码
while(还没到目标)
{
    读取当前角度
    计算误差
    发送控制命令
}

你以后学 PID 时,会看到非常类似的结构。


9. 一个非常重要的机器人思维

假设:

复制代码
double target = 90.0;
double current = 20.0;

那么:

复制代码
double error = target - current;

得到:

复制代码
error = 70

机器人可能不断重复:

复制代码
读取 current
↓
算 error
↓
根据 error 控制电机
↓
机器人移动
↓
current 改变
↓
重新算 error

这个:

不断重复读取 → 计算 → 控制

就是很多控制系统最基础的思想。

所以 while 对机器人非常重要。


10. while(true) 是什么?

你以后一定会大量看到:

复制代码
while (true)
{
}

先不要害怕。

因为条件直接是:

复制代码
true

所以相当于:

条件永远成立。

也就是:

无限循环。

例如:

复制代码
while (true)
{
    std::cout << "Running" << std::endl;
}

会一直输出:

复制代码
Running
Running
Running
Running
...

11. 为什么机器人反而经常需要无限循环?

因为机器人控制器可能就是要:

一直运行,直到用户关闭程序。

比如:

复制代码
while (true)
{
    读取传感器;
    计算控制量;
    控制电机;
}

可以想象成机器人的"心跳":

复制代码
读取
↓
计算
↓
控制
↓
读取
↓
计算
↓
控制
↓
......

如果它只执行一次:

复制代码
读取一次
控制一次
然后程序结束

机器人就没法持续工作。


12. 那无限循环怎么退出?

后面我们会学:

复制代码
break;

你刚刚在 switch 里见过它。

break 也可以退出循环。

例如:

复制代码
int a = 0;

while (true)
{
    a++;

    if (a == 5)
    {
        break;
    }
}

流程:

复制代码
a = 1
a = 2
a = 3
a = 4
a = 5

当:

复制代码
a == 5

成立:

复制代码
break;

直接退出 while。


13. 注意:这里的 break 和 switch 很像

在:

复制代码
switch

里面:

复制代码
break;

表示退出 switch。

在:

复制代码
while

里面:

复制代码
break;

表示退出当前循环。

你可以先统一理解成:

break = 从当前这层控制结构里跳出去。

以后再细讲嵌套结构。


14. 完整例子

复制代码
#include <iostream>

int main()
{
    int count = 0;

    while (count < 5)
    {
        std::cout << count << std::endl;

        count++;
    }

    return 0;
}

执行过程:

复制代码
count = 0
↓
0 < 5 → true
↓
输出 0
↓
count = 1
↓
1 < 5 → true
↓
输出 1
↓
......
↓
count = 5
↓
5 < 5 → false
↓
退出循环

最终:

复制代码
0
1
2
3
4

注意:

不会输出 5。

因为当 count = 5 时,条件已经不成立了。


15. 再看一个机械臂版本

复制代码
#include <iostream>

int main()
{
    double current_angle = 0.0;
    double target_angle = 3.0;

    while (current_angle < target_angle)
    {
        current_angle += 1.0;

        std::cout << current_angle << std::endl;
    }

    return 0;
}

执行:

复制代码
current_angle = 0

第 1 次:

复制代码
0 < 3
true

current_angle = 1
输出 1

第 2 次:

复制代码
1 < 3
true

current_angle = 2
输出 2

第 3 次:

复制代码
2 < 3
true

current_angle = 3
输出 3

第 4 次判断:

复制代码
3 < 3
false

结束。


16. while 最重要的三个问题

以后每看到一个 while,你都问:

第一:循环条件是什么?

例如:

复制代码
while (count < 5)

条件:

复制代码
count < 5

第二:循环里面重复做什么?

例如:

复制代码
std::cout << count << std::endl;

输出。


第三:什么东西会发生变化?

例如:

复制代码
count++;

如果没有变化,就要警惕:

会不会死循环?


本课小练习

第 1 题

复制代码
int a = 0;

while (a < 3)
{
    a++;
}

std::cout << a << std::endl;

最终输出什么?


第 2 题

复制代码
int count = 1;

while (count <= 3)
{
    std::cout << count << std::endl;
    count++;
}

依次输出什么?


第 3 题

下面代码有什么问题?

复制代码
int a = 0;

while (a < 5)
{
    std::cout << a << std::endl;
}

第 4 题

下面:

复制代码
while (true)
{
}

是什么意思?

你继续说 "给出答案并进入下一课" ,下一课我们就讲 第 8 课:for 循环。

那时你会明白为什么以后 C++ 代码里经常看到这种东西:

复制代码
for (int i = 0; i < 6; i++)

而这对六轴机械臂尤其重要,因为以后遍历 Joint1 ~ Joint6、数组、轨迹点、传感器数据,都会大量使用 for。

相关推荐
小朱爱编程1231 小时前
我用 Jev 做了三个实用工具:整理标签页、分诊飞书反馈、找回 GitHub 收藏
java·开发语言·人工智能·后端·python·架构·ai编程
谢亮_vipxieliang1 小时前
Java 8/11/17/21/25 怎么选?一篇讲清 LTS 升级路线
java·开发语言
Cindy_cd2 小时前
IDEA2021 配置 JDK+Maven
java·开发语言·maven
blxr_2 小时前
力扣hot100爬楼梯https://leetcode.cn/problems/climbing-stairs/
算法·leetcode·职场和发展
pride.li2 小时前
ISP标定-NR标定(Noise Reduction,降噪校准)
算法·计算机视觉·isp
CQU_JIAKE2 小时前
9.29【A】
算法·深度优先
没落之王2 小时前
AI在文言文——论文脉复苏对AI的意义
大数据·人工智能·算法
mmsx3 小时前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
huanbailu3 小时前
Qt 跨线程信号槽:connect 返回 true 但槽函数不执行的坑
开发语言·c++·qt·信号槽·跨线程·元类型