C语言 switch case 语句优化方案其一

源switch例程

这是一个用于计时的函数,细心的朋友应该可以发现,这段代码还隐藏一段 if 语句的优化方案,那就是提前return,干掉else。

结构体内容如下:

复制代码
typedef struct {
volatile    unsigned long Time_Cnt;
volatile    unsigned int  time;
volatile    unsigned char flag;
}Tick_OBJ;

unsigned char Tick_Time(Tick_OBJ* t){ 
	 
	if(t->time==0){ 
    t->time=0; t->Time_Cnt=0; 
    return 1;
	}
  /*计数时间大于0时*/
  
   switch(t->flag){ //检差小数点标志位置 
			case 0: if(++t->Time_Cnt>=2)			  {t->Time_Cnt=0;t->time--;} break; //10ms
			case 1: if(++t->Time_Cnt>=20)			  {t->Time_Cnt=0;t->time--;} break; //100ms
			case 2: if(++t->Time_Cnt>=200)		  {t->Time_Cnt=0;t->time--;} break; //1s
			case 3: if(++t->Time_Cnt>=12000)	  {t->Time_Cnt=0;t->time--;} break;//1分钟  这些是定时器时钟为1ms的,模式扫描为5ms一次
      case 4: if(++t->Time_Cnt>=720000)	  {t->Time_Cnt=0;t->time--;} break;//1小时
			default:			return 1;                                           
		}
	return 0; //计时没有结束返回0
}

当case语句较少的时候还能接收,假如很多的时候就会难以维护,这里提供一种思维。

优化后

复制代码
unsigned char Get_Tick_Time(Tick_OBJ* t){
    unsigned long time_f[FLAG_NUM]={2,20,200,12000};
 	if(t->time == 0){ // 
    return 1;
	}
//   if(t->flag < FLAG_NUM){ //防止单位参数错误
     ++t->Time_Cnt>=time_f[t->flag] ? t->time--,t->Time_Cnt=0 : (void)0 ;     
//   }
   return 0;
}

将分支的选择,变成了对数组的引用。既能缩短代码,又能提高效率,然后既然是数组,那就最好做一个保护措施,防止越界。

相关推荐
Zevalin爱灰灰3 小时前
能源与电源管理电路——防倒灌电路
单片机·嵌入式硬件·电源管理
jianqiang.xue5 小时前
ESP-IDF保姆级入门02|Ubuntu24.04搭建EIM-GUI开发环境,打通Windows_Linux双平台统一开发
stm32·单片机·物联网
ziguo11226 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
嵌入式-老费7 小时前
esp32开发与应用(添加数据分区)
单片机·嵌入式硬件
三十岁老牛再出发8 小时前
07.26每日总结
linux·c语言·mysql
code_pgf9 小时前
C/C++ 常用容器功能汇总
c语言·开发语言·c++
个 人 练 习 生9 小时前
strcmp与strstr函数的模拟实现
c语言·开发语言·经验分享·学习·程序人生
小羊先生car9 小时前
RTOS-F429-HAL-基础内容认识(2026/7/26)
c语言
CYLAM202510 小时前
STC32G 单片机0.96“OLED 西历农历可调万年历 (1901-2100)
单片机·嵌入式硬件·stc32g·万年历·西历农历·0.96”oled 12864·4x4 矩阵键盘
Discipline~Hai11 小时前
ARM03-蜂鸣器和中断
c语言·arm开发·单片机·嵌入式硬件·嵌入式