优化这段代码int app_add_years(uint8_t * date, uint8_t offset,uint8_t * new_date)//add by linjinlong 20220605 { unsigned int d,m, y; char chLeapFlag; app_bcd_to_long(date,2,&y); app_bcd_to_long(date+2,1,&m); app_bcd_to_long(date+3,1,&d); y += offset; if( m>12 || m<=0 ) m=12; if( d>31 || d<=0 ) d=31; if( (m==4 || m==6 || m==9 || m==11) && d==31 ) d=30; if( m==2 ){ chLeapFlag = 0; if( (y%400==0) ||( y%4==0 && y%100 != 0)) chLeapFlag = 1;//闰年 if( chLeapFlag!=1 && d>28 ) d=28; if( chLeapFlag==1 && d>29 ) d=29; } app_long_to_bcd(new_date,2,y); app_long_to_bcd(new_date+2,1,m); app_long_to_bcd(new_date+3,1,d); return 0; }
时间: 2024-03-27 20:37:59 浏览: 19
首先,建议对代码进行注释,以便阅读和理解。其次,可以考虑以下优化:
1. 将参数改为结构体,以便传递数据。
2. 在输入参数检查之后,可以使用 switch 语句代替 if 语句,使代码更简洁可读。
3. 可以使用三目运算符来简化一些操作,如判断是否为闰年。
4. 可以使用宏定义来定义常量,如月份和天数的上限。
5. 可以使用内联函数来优化一些操作,如 app_bcd_to_long 和 app_long_to_bcd。
参考优化代码如下:
```c
#define MONTH_MAX 12
#define DAY_MAX 31
#define FEB_DAY_LEAP 29
#define FEB_DAY_NONLEAP 28
#define APP_BCD_TO_LONG(a,b,c) app_bcd_to_long(a,b,c)
#define APP_LONG_TO_BCD(a,b,c) app_long_to_bcd(a,b,c)
typedef struct {
uint8_t* date;
uint8_t offset;
uint8_t* new_date;
} AppData;
inline void app_bcd_to_long(uint8_t* bcd, uint8_t len, uint32_t* num) {
uint8_t i;
*num = 0;
for (i = 0; i < len; i++) {
*num = (*num * 10) + ((bcd[i] >> 4) * 10) + (bcd[i] & 0x0F);
}
}
inline void app_long_to_bcd(uint8_t* bcd, uint8_t len, uint32_t num) {
uint8_t i;
for (i = 0; i < len; i++) {
bcd[i] = ((num % 10) & 0x0F) + (((num / 10) % 10) << 4);
num /= 10;
}
}
int app_add_years(AppData* data) {
uint32_t d, m, y;
char chLeapFlag;
APP_BCD_TO_LONG(data->date, 2, &y);
APP_BCD_TO_LONG(data->date + 2, 1, &m);
APP_BCD_TO_LONG(data->date + 3, 1, &d);
y += data->offset;
if (m > MONTH_MAX || m <= 0) {
m = MONTH_MAX;
}
if (d > DAY_MAX || d <= 0) {
d = DAY_MAX;
}
switch (m) {
case 4:
case 6:
case 9:
case 11:
if (d == DAY_MAX) {
d = DAY_MAX - 1;
}
break;
case 2:
chLeapFlag = 0;
if ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0)) {
chLeapFlag = 1;
}
d = (chLeapFlag == 1) ? ((d > FEB_DAY_LEAP) ? FEB_DAY_LEAP : d) : ((d > FEB_DAY_NONLEAP) ? FEB_DAY_NONLEAP : d);
break;
default:
break;
}
APP_LONG_TO_BCD(data->new_date, 2, y);
APP_LONG_TO_BCD(data->new_date + 2, 1, m);
APP_LONG_TO_BCD(data->new_date + 3, 1, d);
return 0;
}
```