上一课标准答案:
-
输出
1 -
输出
20 -
a != 5表示:判断a是否不等于5 -
应写:
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;
}