关键词: C语言 keil 单片机 STM32
鹅鹅鹅,为什么我会想写这个文章呢????
因为最近要督促自己学习了,好吧也不废话了,开始上干货。
1.先看一段代码
这是一个9选1的舵机选择器,选中其中一个舵机,其中一个舵机转向90度,其他舵机保持不变,唉有人一想我用 if else 不是轻轻松松,不不不,我想你错了,这样写的代码很长可读性也很差,我也犯过这样的错误,下面是用switch语句来写的,是不是也很繁琐,更何况 if else ,而且这里有一个编程的小知识点,很多人在争论if else 和 switch 那个好用,很多人说if else 快啊,switch好维护,其实都有优缺点,我个人的建议是三个以上的判断用switch,三个以下及三个用if else,这是我在一本书上看到的,如果你觉得有用,就给我点个赞,没用就当我瞎扯淡。
/*
函数说明: 舵机 91 选择器
返回值: 无
*/
void Servo_91Selectors(uint8_t Random_Number)
{
switch(Random_Number)
{
case 1:
Set_Servo_Angle(A1,90);
Set_Servo_Angle(A2,0);
Set_Servo_Angle(A3,0);
Set_Servo_Angle(B1,0);
Set_Servo_Angle(B2,0);
Set_Servo_Angle(B3,0);
Set_Servo_Angle(C1,0);
Set_Servo_Angle(C2,0);
Set_Servo_Angle(C3,0);
break;
case 2:
Set_Servo_Angle(A1,0);
Set_Servo_Angle(A2,90);
Set_Servo_Angle(A3,0);
Set_Servo_Angle(B1,0);
Set_Servo_Angle(B2,0);
Set_Servo_Angle(B3,0);
Set_Servo_Angle(C1,0);
Set_Servo_Angle(C2,0);
Set_Servo_Angle(C3,0);
break;
此处省略一万行
default :
Set_Servo_Angle(A1,0);
Set_Servo_Angle(A2,0);
Set_Servo_Angle(A3,0);
Set_Servo_Angle(B1,0);
Set_Servo_Angle(B2,0);
Set_Servo_Angle(B3,0);
Set_Servo_Angle(C1,0);
Set_Servo_Angle(C2,0);
Set_Servo_Angle(C3,0);
break;
}
}
2.再看我一段代码
这是经过优化后的代码,利用了三目运算符来简化代码,增加可读性,减少了代码的重复性,更加简洁,这段代码先定义了两个宏,一个是选择状态(90度),一个是非选择状态(0度),这又是一个小技巧了,现实往往会因为每个人的安装方式不同(比如说开门,有些门能0到90为开和关,有些门因为安装的比较特殊,可以0到75度,可能是挡着了等等因素),选择和非选择的角度也不同,难道一个个改?显然是不可能的,改宏的值即可,这样就不用一个个改了。第二个就是三目运算符了,这是一个判断id 是否相等于随机数的宏,如果相等就给选择的舵机id输出90度,反之为0度。
#define Initial_Angle 0
#define Angle_in_selection 90
#define Equal_To(id,Random_Number) (id == Random_Number ? Angle_in_selection : Initial_Angle)
/*
函数说明: 舵机 91 选择器
返回值: 无
*/
void Servo_91Selectors(uint8_t Random_Number)
{
static uint8_t a=0;
Set_Servo_Angle(A1,a=Equal_To(DJ_A1,Random_Number));
Set_Servo_Angle(A2,a=Equal_To(DJ_A2,Random_Number));
Set_Servo_Angle(A3,a=Equal_To(DJ_A3,Random_Number));
Set_Servo_Angle(B1,a=Equal_To(DJ_B1,Random_Number));
Set_Servo_Angle(B2,a=Equal_To(DJ_B2,Random_Number));
Set_Servo_Angle(B3,a=Equal_To(DJ_B3,Random_Number));
Set_Servo_Angle(C1,a=Equal_To(DJ_C1,Random_Number));
Set_Servo_Angle(C2,a=Equal_To(DJ_C2,Random_Number));
Set_Servo_Angle(C3,a=Equal_To(DJ_A1,Random_Number));
}
看不懂三目运算符的可以看这段代码
#define Equal_To(id,Random_Number) (id == Random_Number ? Angle_in_selection : Initial_Angle)
if (id == Random_Number)
{
return 90;
}
else
{
return 0;
}
eee,到这里就结束了,离点灯大师又进了一步,哈哈哈哈哈哈