上一课标准答案:
- 输出
20 - 输出
3 break;的作用:执行完当前case后,退出这个switch,避免继续执行下面的其他case- 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。