C++ 第 5 课:else if + 多条件判断 + && / || / !

上一课标准答案:

  1. 输出 1

  2. 输出 20

  3. a != 5 表示:判断 a 是否不等于 5

  4. 应写:

    if (distance < 0.1)
    {
    }

你上一课最需要记住的是:

复制代码
==   等于
!=   不等于
>    大于
<    小于
>=   大于等于
<=   小于等于

这些比较表达式最终都会得到:

复制代码
true

或者:

复制代码
false

第 5 课:else if + 多条件判断 + && / || / !

上一课我们学了:

复制代码
if
else

它只能处理:

两种情况。

比如:

复制代码
速度超过 100
或者
速度没有超过 100

但真实机器人经常不是只有两种状态。

例如电机温度:

复制代码
< 60℃        正常
60~80℃       警告
> 80℃        过热

这时候就需要:

复制代码
else if

1. else if 是什么?

先看结构:

复制代码
if (条件1)
{
    ...
}
else if (条件2)
{
    ...
}
else
{
    ...
}

你可以翻译成:

如果条件1成立,做第一件事。

否则再判断条件2。

如果条件2也不成立,就执行最后的 else。


2. 最简单的例子

复制代码
int score = 75;

if (score >= 90)
{
    std::cout << 1 << std::endl;
}
else if (score >= 60)
{
    std::cout << 2 << std::endl;
}
else
{
    std::cout << 3 << std::endl;
}

我们一步一步看。

首先:

复制代码
score = 75;

先判断:

复制代码
score >= 90

也就是:

复制代码
75 >= 90

结果:

复制代码
false

所以第一块不执行。

继续判断:

复制代码
score >= 60

也就是:

复制代码
75 >= 60

结果:

复制代码
true

于是输出:

复制代码
2

然后整个 if / else if / else 就结束了。


3. 非常重要:前面成立后,后面不再判断

看:

复制代码
int score = 95;

if (score >= 90)
{
    std::cout << 1 << std::endl;
}
else if (score >= 60)
{
    std::cout << 2 << std::endl;
}

其实:

复制代码
95 >= 90

成立。

所以输出:

复制代码
1

虽然:

复制代码
95 >= 60

也成立,

但是第二个条件不会再判断。

这就是:

从上往下找第一个成立的条件。

可以画成:

复制代码
条件1?
  │
  ├─ true → 执行 → 整个结构结束
  │
  └─ false
       ↓
     条件2?
       │
       ├─ true → 执行 → 结束
       │
       └─ false
            ↓
           else

4. 机器人温度例子

假设:

复制代码
double temperature = 75.0;

我们规定:

复制代码
> 80     过热
>= 60    警告
其他     正常

代码:

复制代码
if (temperature > 80.0)
{
    std::cout << "Overheat" << std::endl;
}
else if (temperature >= 60.0)
{
    std::cout << "Warning" << std::endl;
}
else
{
    std::cout << "Normal" << std::endl;
}

因为:

复制代码
75 > 80

是 false。

然后:

复制代码
75 >= 60

是 true。

所以输出:

复制代码
Warning

5. 为什么判断顺序很重要?

看下面这种错误写法:

复制代码
if (temperature >= 60.0)
{
    std::cout << "Warning" << std::endl;
}
else if (temperature > 80.0)
{
    std::cout << "Overheat" << std::endl;
}

如果:

复制代码
temperature = 100.0;

第一句:

复制代码
100 >= 60

已经成立。

所以直接输出:

复制代码
Warning

后面的:

复制代码
temperature > 80

根本不会执行。

这显然不符合我们的意图。

所以对于这种区间判断,通常要:

从更严格、更特殊的条件开始判断。

比如:

复制代码
先 > 80
再 >= 60
最后 else

这个习惯以后写机器人安全逻辑时很重要。


6. 一个条件不够怎么办?

比如我们想判断:

机械臂角度既要大于 0,又要小于 90。

也就是说:

复制代码
angle > 0
并且
angle < 90

这时候需要:

复制代码
&&

7. &&:并且

复制代码
&&

表示:

AND,且,并且。

例如:

复制代码
double angle = 45.0;

if (angle > 0.0 && angle < 90.0)
{
    std::cout << "Valid" << std::endl;
}

我们拆开看:

左边:

复制代码
angle > 0.0

结果:

复制代码
45 > 0
true

右边:

复制代码
angle < 90.0

结果:

复制代码
45 < 90
true

然后:

复制代码
true && true

结果:

复制代码
true

所以进入 if。


8. && 必须两边都成立

你可以把它想象成"两把钥匙"。

复制代码
条件A ──┐
        ├── 两把钥匙都对 → true
条件B ──┘

真值关系:

复制代码
true  && true   → true
true  && false  → false
false && true   → false
false && false  → false

所以:

&& 要求所有条件都成立。


9. 机器人安全范围特别常用 &&

例如机械臂 Joint1 允许:

复制代码
-90° ~ +90°

可以写:

复制代码
double angle = 30.0;

if (angle >= -90.0 && angle <= 90.0)
{
    std::cout << "Angle valid" << std::endl;
}

意思就是:

角度必须同时满足大于等于 -90,并且小于等于 90。

以后你做关节限位判断,会经常见到这种代码。


10. ||:或者

第二个重要符号:

复制代码
||

表示:

OR,或者。

例如:

如果温度过高,或者电流过大,就停止。

复制代码
if (temperature > 80.0 || current > 10.0)
{
    std::cout << "Stop" << std::endl;
}

只要:

复制代码
温度过高

或者:

复制代码
电流过大

其中一个成立,就进入 if。


11. || 只需要一个条件成立

真值关系:

复制代码
true  || true   → true
true  || false  → true
false || true   → true
false || false  → false

所以:

只有两个条件都不成立时,结果才是 false。


12. && 和 || 的直觉区别

你可以这样记:

复制代码
&&
并且
两个都要

||
或者
至少一个

例如:

复制代码
if (battery_ok && motor_ok)

意思是:

电池正常,并且电机正常。

两个都正常才继续。

而:

复制代码
if (motor_error || sensor_error)

意思是:

电机错误或者传感器错误。

只要一个出错,就进入故障处理。


13. !:不是 / 取反

现在第三个:

复制代码
!

表示:

NOT,取反。

例如:

复制代码
bool motor_ok = true;

那么:

复制代码
!motor_ok

就是:

复制代码
false

因为:

复制代码
motor_ok = true

取反后:

复制代码
false

14. 用开关理解 !

假设:

复制代码
true  = 开
false = 关

那么:

复制代码
!

就像:

把状态反过来。

所以:

复制代码
!true  → false
!false → true

15. 机器人中很常见

比如:

复制代码
bool connected = false;

我们想判断:

如果还没有连接,就报警。

可以写:

复制代码
if (!connected)
{
    std::cout << "Not connected" << std::endl;
}

因为:

复制代码
connected = false

所以:

复制代码
!connected = true

于是进入 if。


16. 比较一个常见写法

下面两种:

复制代码
if (connected == false)

和:

复制代码
if (!connected)

基本是在表达同一个意思:

如果没有连接。

初学时你写第一种更直观:

复制代码
if (connected == false)

以后熟了,经常会看到:

复制代码
if (!connected)

17. 现在看一个稍微真实一点的机器人例子

假设:

复制代码
bool connected = true;
bool motor_error = false;
double angle = 45.0;

我们要求:

已连接

没有电机错误

角度在 -90 到 90 之间

才允许运动。

可以写:

复制代码
if (connected == true &&
    motor_error == false &&
    angle >= -90.0 &&
    angle <= 90.0)
{
    std::cout << "Move allowed" << std::endl;
}

你先不用害怕它很长。

我们拆开就是:

复制代码
connected == true
并且

motor_error == false
并且

angle >= -90
并且

angle <= 90

所有条件都成立:

复制代码
↓
允许运动

这已经非常接近真实机械臂程序中的"安全条件判断"了。


18. 更简洁的版本

以后你熟悉 bool 后,可能看到:

复制代码
if (connected &&
    !motor_error &&
    angle >= -90.0 &&
    angle <= 90.0)
{
    std::cout << "Move allowed" << std::endl;
}

其中:

复制代码
connected

表示:

connected 为 true。

而:

复制代码
!motor_error

表示:

motor_error 为 false。

现在你能大概读懂就够了。


19. 一个完整程序

复制代码
#include <iostream>

int main()
{
    double temperature = 70.0;
    bool motor_error = false;

    if (motor_error == true)
    {
        std::cout << "Motor error" << std::endl;
    }
    else if (temperature > 80.0)
    {
        std::cout << "Overheat" << std::endl;
    }
    else
    {
        std::cout << "System normal" << std::endl;
    }

    return 0;
}

我们自己推演。

首先:

复制代码
motor_error = false

所以:

复制代码
motor_error == true

结果:

复制代码
false

继续。

复制代码
temperature = 70

所以:

复制代码
temperature > 80

结果:

复制代码
false

最后进入:

复制代码
else

输出:

复制代码
System normal

20. 这几个符号以后会大量出现

你现在先形成这种条件反射:

复制代码
==    是否等于

!=    是否不等于

&&    并且

||    或者

!     不是 / 取反

以后你看到:

复制代码
if (connected && !error)

不要被符号吓到。

翻译一下就是:

如果已经连接,并且没有错误。


本课小练习

第 1 题

复制代码
int a = 7;

if (a > 10)
{
    std::cout << 1 << std::endl;
}
else if (a > 5)
{
    std::cout << 2 << std::endl;
}
else
{
    std::cout << 3 << std::endl;
}

输出什么?

第 2 题

复制代码
int a = 5;
int b = 10;

bool result = (a < 10 && b > 5);

result 是 true 还是 false?

第 3 题

复制代码
bool error = false;

if (!error)
{
    std::cout << 1 << std::endl;
}

会不会输出 1?

第 4 题

假设机械臂只有在:

复制代码
角度 >= -90
并且
角度 <= 90

时才允许运动。

把条件补完整:

复制代码
if ( ______________________________ )
{
    std::cout << "Move" << std::endl;
}
相关推荐
ynchyong1 小时前
python list 地常用操作
开发语言·python
千谦阙听1 小时前
【C++篇】:string类——常用接口、底层原理与深浅拷贝
开发语言·c++·学习·visual studio
特立独行的猫A2 小时前
c++的`std::future` 与 `std::promise` 简明教程(5分钟读完)
c++
特立独行的猫A2 小时前
C++ 异步编程:std::future 与 std::promise 详解(含 RPC 客户端实现实践)
c++·后端
m0_380743872 小时前
PHP7.1项目升级到8.3报错怎么解决
开发语言·php
All for pursuit.2 小时前
【分治-2】215.数组中的第K个最大元素
数据结构·c++·算法·leetcode
泡海椒2 小时前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel
lcj25112 小时前
【C++】set和map——详细使用说明
开发语言·c++·笔记·面试
潼心1412o2 小时前
C++初阶(长期更新)第3讲:类和对象(中)
开发语言·c++