上一课标准答案:
-
输出
2 -
result = true -
会输出
1 -
条件应写:
if (angle >= -90.0 && angle <= 90.0)
{
std::cout << "Move" << std::endl;
}
上一课最重要的是:
&& 并且,所有条件都要成立
|| 或者,至少一个条件成立
! 取反
第 6 课:switch ------ 多状态选择
前面我们学了:
if
else if
else
它非常灵活。
但如果程序只是根据一个变量的不同"固定值"选择不同操作,switch 往往更清楚。
例如机械臂状态:
0 = 停止
1 = 运行
2 = 故障
3 = 回零
我们当然可以写:
if (state == 0)
{
// 停止
}
else if (state == 1)
{
// 运行
}
else if (state == 2)
{
// 故障
}
else if (state == 3)
{
// 回零
}
但是 C++ 还有一种专门处理这种情况的结构:
switch
1. 最基本的 switch
先看代码:
int state = 2;
switch (state)
{
case 0:
std::cout << "Stop" << std::endl;
break;
case 1:
std::cout << "Running" << std::endl;
break;
case 2:
std::cout << "Error" << std::endl;
break;
}
现在不要急着背。
我们一点点拆。
2. switch (state) 是什么意思?
switch (state)
可以理解成:
看一看
state现在是什么值,然后去找对应情况。
假设:
state = 2;
那么程序会去找:
case 2:
所以:
state = 2
↓
switch(state)
↓
寻找 case 2
↓
执行 case 2
最终输出:
Error
3. case 是什么?
case 0:
可以理解成:
如果
state的值是0,执行这里。
所以:
case 1:
表示:
如果是
1。
case 2:
表示:
如果是
2。
注意 case 后面不是分号:
case 2;
这是错的。
而是:
case 2:
后面用的是:
:
冒号。
4. 为什么需要 break?
这是 switch 最容易出错的地方。
看:
case 2:
std::cout << "Error" << std::endl;
break;
这里:
break;
可以理解成:
到这里就离开这个
switch。
也就是:
找到对应 case
↓
执行内容
↓
break
↓
退出 switch
5. 如果不写 break 会怎样?
看这个例子:
int state = 1;
switch (state)
{
case 0:
std::cout << "A" << std::endl;
case 1:
std::cout << "B" << std::endl;
case 2:
std::cout << "C" << std::endl;
}
因为:
state = 1;
程序先找到:
case 1:
输出:
B
但是没有 break。
于是它会继续往下执行:
case 2:
于是又输出:
C
最终是:
B
C
这叫:
fall-through,继续向下贯穿执行。
你现在不需要记英文。
只要记:
初学阶段,每个
case后通常都要写break;。
6. 标准写法
switch (state)
{
case 0:
std::cout << "Stop" << std::endl;
break;
case 1:
std::cout << "Running" << std::endl;
break;
case 2:
std::cout << "Error" << std::endl;
break;
}
这样:
state = 0 → Stop
state = 1 → Running
state = 2 → Error
7. 如果没有匹配的 case 怎么办?
比如:
int state = 9;
但是我们只有:
case 0:
case 1:
case 2:
这时候可以使用:
default:
例如:
switch (state)
{
case 0:
std::cout << "Stop" << std::endl;
break;
case 1:
std::cout << "Running" << std::endl;
break;
case 2:
std::cout << "Error" << std::endl;
break;
default:
std::cout << "Unknown state" << std::endl;
break;
}
如果:
state = 9;
就会进入:
default:
输出:
Unknown state
你可以把 default 理解成:
其他情况。
所以它有点像:
else
8. switch 和 if 有什么区别?
这是今天真正需要理解的地方。
假设:
int state = 2;
你想判断:
state 是 0?
state 是 1?
state 是 2?
state 是 3?
这种情况很适合:
switch
因为你是在比较:
同一个变量的固定值。
但如果你要判断:
temperature > 80
或者:
angle >= -90 && angle <= 90
这种条件就更适合:
if
9. 最简单的判断方法
你现在可以先这样记:
switch
适合:
一个变量
+
几个明确的固定值
例如:
state == 0
state == 1
state == 2
if
适合:
大小比较
范围判断
多个条件组合
例如:
temperature > 80
angle >= -90 && angle <= 90
connected && !error
10. 机器人状态机的雏形
这个概念以后特别重要。
机械臂可能有这些状态:
int robot_state = 0;
规定:
0 = Idle 空闲
1 = Moving 运动
2 = Error 故障
3 = Homing 回零
于是:
switch (robot_state)
{
case 0:
std::cout << "Idle" << std::endl;
break;
case 1:
std::cout << "Moving" << std::endl;
break;
case 2:
std::cout << "Error" << std::endl;
break;
case 3:
std::cout << "Homing" << std::endl;
break;
default:
std::cout << "Unknown" << std::endl;
break;
}
这种程序结构以后在:
机器人控制
嵌入式程序
ESP32
ROS2
机械臂控制器
里面都很常见。
11. 逐行看一遍
#include <iostream>
int main()
{
int robot_state = 3;
switch (robot_state)
{
case 0:
std::cout << "Idle" << std::endl;
break;
case 1:
std::cout << "Moving" << std::endl;
break;
case 2:
std::cout << "Error" << std::endl;
break;
case 3:
std::cout << "Homing" << std::endl;
break;
default:
std::cout << "Unknown" << std::endl;
break;
}
return 0;
}
执行:
robot_state = 3
进入:
switch (robot_state)
寻找:
case 3:
找到以后执行:
std::cout << "Homing" << std::endl;
输出:
Homing
然后:
break;
退出 switch。
12. 一个特别重要的理解
switch 不是循环。
很多初学者看到:
switch
可能误以为它会一直执行。
不会。
它只是:
根据当前值,选择一条分支执行一次。
例如:
int state = 1;
switch (state)
{
...
}
执行完相应 case 后,程序继续向下运行。
本课小练习
第 1 题
int state = 1;
switch (state)
{
case 0:
std::cout << 10 << std::endl;
break;
case 1:
std::cout << 20 << std::endl;
break;
case 2:
std::cout << 30 << std::endl;
break;
}
输出什么?
第 2 题
int state = 5;
switch (state)
{
case 0:
std::cout << 1 << std::endl;
break;
case 1:
std::cout << 2 << std::endl;
break;
default:
std::cout << 3 << std::endl;
break;
}
输出什么?
第 3 题
break; 在这里主要是干什么的?
第 4 题
下面两个需求分别更适合 if 还是 switch?
A. 判断机械臂温度是否大于 80℃
B. 根据 robot_state 的 0、1、2、3 执行不同动作