上一课标准答案:
- 输出
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++ 还有一种专门处理这种情况的结构:
switch1. 最基本的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最终输出:
Error3.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 ↓ 退出 switch5. 如果不写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 → Error7. 如果没有匹配的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理解成:
其他情况。
所以它有点像:
else8.switch和if有什么区别?
这是今天真正需要理解的地方。
假设:
int state = 2;你想判断:
state 是 0? state 是 1? state 是 2? state 是 3?这种情况很适合:
switch因为你是在比较:
同一个变量的固定值。
但如果你要判断:
temperature > 80或者:
angle >= -90 && angle <= 90这种条件就更适合:
if9. 最简单的判断方法
你现在可以先这样记:
switch
适合:
一个变量 + 几个明确的固定值例如:
state == 0 state == 1 state == 2if
适合:
大小比较 范围判断 多个条件组合例如:
temperature > 80angle >= -90 && angle <= 90connected && !error10. 机器人状态机的雏形
这个概念以后特别重要。
机械臂可能有这些状态:
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 执行不同动作