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;
}

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

相关推荐
希和202711 小时前
江科大 51 单片机课程笔记:DS1302 实时时钟 + LCD1602 可调电子钟(小白逐行讲解)
笔记·单片机·嵌入式硬件
女神下凡11 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
another heaven18 小时前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
another heaven2 天前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude2 天前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
少司府2 天前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
Zwawa2 天前
让屏幕动起来:OLED动画效果,丝滑光标、帧动画和一只贪吃蛇
c语言·单片机·嵌入式
简单电磁炮2 天前
FWD八位单片机调试问题
单片机·嵌入式硬件
꧁细听勿语情꧂2 天前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
菥蓂寻生2 天前
STM32移植到GD32中以105为例
stm32·单片机·嵌入式硬件