C++ 第 6 课:switch —— 多状态选择

上一课标准答案:

  1. 输出 2

  2. result = true

  3. 会输出 1

  4. 条件应写:

    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 执行不同动作
相关推荐
小凡geo1 小时前
本地商家 GEO:用脚本一键生成 FAQPage 结构化数据,让 AI 切片更稳
开发语言·人工智能·python·microsoft·搜索引擎·ai
朝朝辞暮i2 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
苏打豆2 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
波力海苔夹心脆6752 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
m0_380743872 小时前
Qt中导航栏实现的详细指南
开发语言·c++
FluxArt2 小时前
GPT Image 2.5 中文提示词教程:Flux Art 可复用模板
前端·gpt·算法
mhmh1232 小时前
Python 对象模型与数据模型:魔术方法、描述符与元类深度解析
开发语言·python
估值探索者2 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
思麟呀2 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法