第 2 课:变量、数据类型和基本运算
这一课我们开始真正接触 C++ 里最常见的一组基础。
今天只学:
int
double
char
bool
以及最简单的:
+ - * /
先不多学。
1. 为什么 C++ 要区分数据类型?
假设机械臂程序需要保存下面这些信息:
关节编号:3
关节角度:45.6°
电机状态:正常 / 异常
状态字符:'A'
它们明显不是同一种东西。
所以 C++ 要告诉计算机:
这块内存准备存什么类型的数据?
比如:
int joint = 3;
表示:
joint
┌─────┐
│ 3 │
└─────┘
类型:整数
而:
double angle = 45.6;
表示:
angle
┌────────┐
│ 45.6 │
└────────┘
类型:小数
2. int:整数
你已经认识它了。
int age = 20;
例如:
int joint = 1;
int speed = 5;
int count = 100;
这些都是整数。
可以保存:
0
1
5
100
-3
-50
但它的设计目标不是存:
3.14
45.6
0.001
3. double:小数
机器人里面特别常用。
double angle = 30.5;
例如:
double joint1 = 45.2;
double distance = 0.35;
double speed = 5.5;
以后你写机械臂程序,会大量见到它。
比如:
double target_angle = 30.5;
意思就是:
目标角度是 30.5。
4. char:单个字符
例如:
char grade = 'A';
注意:
'A'
两边是单引号。
char 一般只保存一个字符。
比如:
char state = 'R';
可以约定:
R = Ready
E = Error
因此:
char state = 'E';
可以表示设备当前处于 Error 状态。
当然,真实工程里通常不会只靠一个 char 来做复杂状态管理,这只是现在为了理解类型。
5. bool:真假
这个特别重要。
bool motor_on = true;
bool 只有两个主要值:
true
false
分别表示:
真
假
例如:
bool motor_on = true;
可以理解成:
电机当前开启。
而:
bool emergency_stop = false;
可以理解成:
急停当前没有触发。
以后机器人控制里会大量出现:
bool connected;
bool initialized;
bool target_reached;
bool gripper_closed;
这类变量。
6. 四种类型放一起看
int joint = 2;
double angle = 45.5;
char state = 'A';
bool motor_on = true;
可以画成:
joint
┌──────┐
│ 2 │
└──────┘
整数
angle
┌──────┐
│ 45.5 │
└──────┘
小数
state
┌──────┐
│ 'A' │
└──────┘
字符
motor_on
┌──────┐
│ true │
└──────┘
真假
7. 基本运算
先看:
int a = 10;
int b = 2;
那么:
int c = a + b;
结果:
c = 12
这是加法。
减法
int c = a - b;
结果:
c = 8
乘法
C++ 乘法不是写:
×
而是:
*
例如:
int c = a * b;
得到:
20
所以:
*
表示乘法。
除法
C++ 用:
/
表示除法。
int c = a / b;
就是:
10 ÷ 2 = 5
所以:
c = 5
8. 一个很重要的坑:整数除法
看这个:
int a = 5;
int b = 2;
int c = a / b;
数学上:
5 ÷ 2 = 2.5
但 C++ 这里得到:
2
不是:
2.5
为什么?
因为:
a
是 int,
b
也是 int。
两个整数相除时,C++ 会进行:
整数除法。
小数部分会被舍掉。
所以:
5 / 2
得到:
2
不是四舍五入,而是小数部分直接不要。
9. 如果我要得到 2.5 呢?
可以写:
double a = 5.0;
double b = 2.0;
double c = a / b;
结果:
2.5
所以你以后做机器人计算时一定要警惕:
int
和:
double
的区别。
比如你在算速度:
距离 / 时间
如果全部写成整数,可能会造成精度丢失。
10. 看一个机械臂小例子
假设机械臂关节当前位置:
double current_angle = 20.0;
目标位置:
double target_angle = 50.0;
我们想算:
还差多少度?
可以:
double error = target_angle - current_angle;
代入:
50.0 - 20.0
得到:
30.0
因此:
error = 30.0;
以后学 PID 的时候,你会经常看到这种:
error = target - current;
所以你现在学的减法,将来会直接进入控制算法。
11. 完整程序逐行看
#include <iostream>
int main()
{
double current_angle = 20.0;
double target_angle = 50.0;
double error = target_angle - current_angle;
std::cout << error << std::endl;
return 0;
}
逐行:
#include <iostream>
准备输入输出工具。
int main()
程序从主函数开始。
double current_angle = 20.0;
创建小数变量 current_angle,保存当前角度 20.0。
double target_angle = 50.0;
创建小数变量 target_angle,保存目标角度 50.0。
double error = target_angle - current_angle;
计算:
50 - 20
得到:
30
然后存进:
error
最后:
std::cout << error << std::endl;
输出:
30
12. 这一课先学到这里
现在做 4 道很小的题。
第 1 题
int a = 8;
int b = 3;
int c = a + b;
c 是多少?
第 2 题
double angle = 45.5;
这里:
double
angle
45.5
分别代表什么?
第 3 题
int a = 5;
int b = 2;
int c = a / b;
最后:
c = ?
第 4 题
假设机械臂:
double target = 60.0;
double current = 25.0;
double error = target - current;
最后:
error = ?
你下一条如果仍然说:
直接给标准答案并进入下一课
我就会给出答案,然后直接开始 第 3 课:运算符、赋值、++ / --,以及 = 和 == 的区别。