OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4230|回复: 6

求教if对多种状态判断语句改switch语句问题?

[复制链接]

89

主题

172

帖子

0

精华

高级会员

Rank: 4

积分
607
金钱
607
注册时间
2015-9-7
在线时间
141 小时
发表于 2017-11-30 17:54:20 | 显示全部楼层 |阅读模式
1金钱
我有一个if语句,来判断一个变量在不同大小范围下执行不同操作,感觉if语句逐条判断效率低,能不能,改成switch语句?要怎么改呢?
              if(bit_counter<9)
                         {
                                bit_set(&DCC_addr,9-bit_counter,data);
                         }
                         if(bit_counter>9&&bit_counter<18)
                         {
                         bit_set(&D1,18-bit_counter,data);}
        if(bit_counter==18&&data==1)
                                {
                                        DCC_byte_size=2;
                                        dcc_cmd_refresh_flag=1;
                                        data_flag=0;
                                        bit_counter=0;
                                }
                                if(bit_counter>18&&bit_counter<27)
                         {bit_set(&D2,27-bit_counter,data);}
                         if(bit_counter==27&&data==1)
                                 {
                                        DCC_byte_size=3;
                                        dcc_cmd_refresh_flag=1;
                                        data_flag=0;
                                        bit_counter=0;
                                       
//                                        HAL_UART_Transmit_IT(&huart1,&D2,1);
                                }
                                if(bit_counter>27&&bit_counter<36)
                         {bit_set(&D3,36-bit_counter,data);}
                                 if(bit_counter==36&&data==1)
                                 {
                                        DCC_byte_size=4;
                                        dcc_cmd_refresh_flag=1;
                                        data_flag=0;
                                        bit_counter=0;
                                }
                                if(bit_counter>36&&bit_counter<45)
                         {bit_set(&D4,45-bit_counter,data);}
                                         if(bit_counter==45&&data==1)
                                 {

                                        DCC_byte_size=5;
         dcc_cmd_refresh_flag=1;
                                        data_flag=0;
                                        bit_counter=0;
                                }
                                if(bit_counter>45&&bit_counter<54)
                         {bit_set(&D5,54-bit_counter,data);}
                                 if(bit_counter==54&&data==1)
                                 {
                                       
                                        DCC_byte_size=6;
                                        dcc_cmd_refresh_flag=1;
                                        data_flag=0;
                                        bit_counter=0;
                                }               

最佳答案

查看完整内容[请看2#楼]

对于你这个程序。。。我觉得用if-else对效率更高。 不是说switch效率就一定比if-else高的。 如果要硬改成switch,你需要设计出一个数学上的分段常值函数,把变量的不同取值范围映射成一个或多个数值,这样才能应用switch。 例如把百分制成绩转化为ABCDE,就可以把百分制成绩用整数除法除以10,case 10 case 9是A ,case 8是B,case 7 是C,case 6是D,case 5 case 4 case 3 case 2 case 1 case 0是E。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2017-11-30 17:54:21 | 显示全部楼层
对于你这个程序。。。我觉得用if-else对效率更高。

不是说switch效率就一定比if-else高的。

如果要硬改成switch,你需要设计出一个数学上的分段常值函数,把变量的不同取值范围映射成一个或多个数值,这样才能应用switch。

例如把百分制成绩转化为ABCDE,就可以把百分制成绩用整数除法除以10,case 10 case 9是A ,case 8是B,case 7 是C,case 6是D,case 5 case 4 case 3 case 2 case 1 case 0是E。
十六进制带我飞。
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-11-30 18:44:28 | 显示全部楼层
芯片跑得N快快了.不怕这个.switch是给程序员看的.
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-12-1 08:36:15 | 显示全部楼层
肯定能改啊,但是这些if耗不了多少时间的。
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2017-12-1 08:48:27 | 显示全部楼层
switch是明确状态的,看你这逻辑,switch并不完美匹配
回复

使用道具 举报

1

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-10-12
在线时间
76 小时
发表于 2017-12-1 09:21:01 | 显示全部楼层
加else不就不会重复判断了么?
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-12-1 09:21:45 | 显示全部楼层
switch 说不好要的时间更多.汇编语言可没有SWITCH指令.转换到汇编后一个德行.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 04:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表