C++ 第 4 课:if / else —— 让程序自己做决定

上一课标准答案:

  1. a = 7
  2. b = 7
  3. result = true
  4. a = 5; 是把 5 存进 a;a == 5 是判断 a 是否等于 5。

最重要的一点还是:

复制代码
=

是赋值,

复制代码
==

是判断是否相等。


第 4 课:if / else ------ 让程序自己做决定

前面的程序基本都是:

从上往下,一行一行执行。

例如:

复制代码
int a = 5;
a = a + 1;
std::cout << a << std::endl;

电脑没有任何选择。

但真实机器人肯定不是这样的。

机器人会需要:

如果前面有障碍物,就停止。

如果已经到达目标,就停止运动。

如果电机报错,就报警。

如果夹爪已经闭合,就不要继续夹。

这种"如果......那么......"就是今天的重点。


1. 什么是 if

先看最简单的:

复制代码
if (条件)
{
    条件成立时执行的代码
}

其中:

复制代码
if

就是英文:

如果。

所以你可以直接把它读成:

复制代码
如果(条件成立)
{
    执行这里
}

2. 一个最简单的例子

复制代码
int a = 5;

if (a == 5)
{
    std::cout << 100 << std::endl;
}

我们一步一步看。

首先:

复制代码
int a = 5;

此时:

复制代码
a = 5

然后:

复制代码
if (a == 5)

先判断:

复制代码
a 是否等于 5?

因为:

复制代码
a = 5

所以:

复制代码
a == 5

结果是:

复制代码
true

条件成立。

因此进入:

复制代码
{
    std::cout << 100 << std::endl;
}

最终输出:

复制代码
100

3. 如果条件不成立呢?

看:

复制代码
int a = 3;

if (a == 5)
{
    std::cout << 100 << std::endl;
}

现在判断:

复制代码
a == 5

也就是:

复制代码
3 == 5

结果:

复制代码
false

于是:

复制代码
{
    std::cout << 100 << std::endl;
}

整块代码直接跳过。

所以这个程序不会输出 100。

可以画成:

复制代码
            a == 5 ?
             /   \
          true   false
           │       │
           ▼       ▼
       执行代码    跳过

这就是程序第一次真正出现"分路"。


4. if 里面为什么又有 {}

你之前已经学过:

复制代码
{
}

表示划出一块代码区域。

所以:

复制代码
if (a == 5)
{
    int b = 10;
    std::cout << b << std::endl;
}

意思是:

如果 a == 5 成立,那么执行花括号里的这一整块代码。

不是只执行第一句。


5. 机器人例子

假设机械臂关节目标角度是:

复制代码
double target = 50.0;

当前角度:

复制代码
double current = 50.0;

我们可以判断:

复制代码
if (current == target)
{
    std::cout << "Target reached" << std::endl;
}

先不用管:

复制代码
"Target reached"

为什么用了双引号。

你现在只把它理解成:

输出一段文字。

程序逻辑就是:

复制代码
current 是否等于 target?
          │
        是
          │
          ▼
输出 Target reached

这已经开始接近真实机器人控制逻辑了。


6. else 是什么?

现在出现另一个重要词:

复制代码
else

意思是:

否则。

基本结构:

复制代码
if (条件)
{
    条件成立时执行
}
else
{
    条件不成立时执行
}

翻译成中文:

复制代码
如果条件成立:
    做 A
否则:
    做 B

7. 例子

复制代码
int a = 10;

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

判断:

复制代码
a == 5

实际上:

复制代码
10 == 5

所以:

复制代码
false

因此:

复制代码
if

里面不执行。

程序进入:

复制代码
else

最终输出:

复制代码
2

8. 可以把它想成岔路口

复制代码
                  条件
                   │
             ┌─────┴─────┐
             │           │
           true        false
             │           │
             ▼           ▼
         if 里面      else 里面

一定注意:

if / else 只会走其中一条路。

不会两边都执行。


9. 再看一个机器人例子

复制代码
bool motor_error = true;

if (motor_error == true)
{
    std::cout << "Stop motor" << std::endl;
}
else
{
    std::cout << "Motor running" << std::endl;
}

因为:

复制代码
motor_error = true;

所以判断:

复制代码
motor_error == true

成立。

于是输出:

复制代码
Stop motor

10. bool 还有更简单的写法

刚才写的是:

复制代码
if (motor_error == true)

实际上以后经常直接写:

复制代码
if (motor_error)

因为 motor_error 本身就是:

复制代码
bool

它里面已经是:

复制代码
true

或者:

复制代码
false

所以:

复制代码
if (motor_error)

就相当于问:

motor_error 是不是 true?

例如:

复制代码
bool motor_error = true;

if (motor_error)
{
    std::cout << "Error" << std::endl;
}

会输出:

复制代码
Error

不过你现在刚开始学,可以暂时先写:

复制代码
if (motor_error == true)

等你熟悉以后再简化。


11. 新的比较符号:> 和 <

只会:

复制代码
==

还不够。

真实程序经常需要判断:

大于、小于。

例如:

复制代码
int temperature = 80;

判断:

复制代码
if (temperature > 70)

这里:

复制代码
>

表示:

大于。

因为:

复制代码
80 > 70

成立,所以进入 if。


<

复制代码
<

表示:

小于。

例如:

复制代码
double distance = 0.05;

if (distance < 0.1)
{
    std::cout << "Very close" << std::endl;
}

因为:

复制代码
0.05 < 0.1

成立。

所以输出:

复制代码
Very close

这已经很像机器人视觉或者避障了。

比如:

复制代码
物体距离 < 10 cm

就停止机械臂。


12. 再认识两个:>= 和 <=

复制代码
>=

表示:

大于或等于。

例如:

复制代码
age >= 18

表示:

age 大于或者等于 18。


复制代码
<=

表示:

小于或等于。

例如:

复制代码
distance <= 0.1

表示:

距离小于或等于 0.1。

所以比较运算符目前可以整理成:

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

还有一个很重要的,我们马上学。


13. !=:不等于

复制代码
!=

表示:

不等于。

例如:

复制代码
int state = 1;

if (state != 0)
{
    std::cout << "Robot active" << std::endl;
}

判断:

复制代码
1 != 0

成立。

所以输出:

复制代码
Robot active

你可以把:

复制代码
!=

理解成:

"不是等于"。

其中:

复制代码
!

以后你会发现经常和"否定"有关。


14. 六个比较运算符先记住

现在整理:

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

它们的计算结果全部都是:

复制代码
true

或者:

复制代码
false

也就是说:

比较运算最终产生的是 bool。

例如:

复制代码
5 > 3

结果:

复制代码
true

5 < 3

结果:

复制代码
false

5 == 5

结果:

复制代码
true

5 != 5

结果:

复制代码
false

15. 一个完整机械臂例子

假设我们设置一个简单的角度限制。

复制代码
#include <iostream>

int main()
{
    double angle = 95.0;

    if (angle > 90.0)
    {
        std::cout << "Angle too large" << std::endl;
    }
    else
    {
        std::cout << "Angle OK" << std::endl;
    }

    return 0;
}

逐步执行。

首先:

复制代码
double angle = 95.0;

所以:

复制代码
angle = 95

然后:

复制代码
if (angle > 90.0)

也就是:

复制代码
95 > 90

结果:

复制代码
true

所以执行:

复制代码
std::cout << "Angle too large" << std::endl;

输出:

复制代码
Angle too large

而:

复制代码
else

里面的内容不会执行。


16. 这已经是"安全判断"的雏形

以后你的机械臂代码可能会有:

复制代码
if (angle > max_angle)
{
    stopMotor();
}

可以翻译成:

如果关节角度超过最大允许角度,就停止电机。

或者:

复制代码
if (distance < safe_distance)
{
    stopRobot();
}

意思是:

如果距离小于安全距离,就停止机器人。

所以你现在学的 if,绝对不是"为了学语法"。

它以后直接就是:

机器人安全逻辑、状态判断和控制逻辑的基础。


17. 现在看一段程序,你应该能自己推演

复制代码
int speed = 80;

if (speed > 100)
{
    std::cout << 1 << std::endl;
}
else
{
    std::cout << 2 << std::endl;
}

电脑先判断:

复制代码
80 > 100?

答案:

复制代码
false

于是走:

复制代码
else

最终:

复制代码
输出 2

本课小练习

第 1 题

复制代码
int a = 10;

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

输出什么?

第 2 题

复制代码
int state = 2;

if (state == 1)
{
    std::cout << 10 << std::endl;
}
else
{
    std::cout << 20 << std::endl;
}

输出什么?

第 3 题

下面:

复制代码
a != 5

是什么意思?

第 4 题

假设:

复制代码
double distance = 0.08;

我们希望:

当距离小于 0.1 时进入 if

应该写:

复制代码
if ( __________ )
{
}
相关推荐
苏打豆1 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
波力海苔夹心脆6752 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
m0_380743872 小时前
Qt中导航栏实现的详细指南
开发语言·c++
mhmh1232 小时前
Python 对象模型与数据模型:魔术方法、描述符与元类深度解析
开发语言·python
估值探索者2 小时前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
思麟呀2 小时前
位运算:从一个整数到一个集合
c语言·数据结构·c++·算法
m0_380743873 小时前
PHP7.3和7.2字符串功能有什么不同
开发语言·php
All for pursuit.3 小时前
【分治-3】347.前K个高频元素
数据结构·c++·算法·leetcode
m0_380743873 小时前
PHP 8.4的新语法怎么用才规范
开发语言·php