jianhong_wu 发表于 2016-9-25 14:07:50

switch语句等价于if和else if语句吗?用switch在主循环时应注意什么问题?已解答。

★坚鸿-深圳:


void main()
{
   //此处暂时省略了一些代码
   while(1)
   {
       key_service(); //按键服务的应用程序
   }

}

void key_service() //按键服务的应用程序
{

switch(ucKeySec) //按键服务状态切换
{
    case 1:// 1号键
          //在这里添加应用代码
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;      
    case 2:// 2号键
          //在这里添加应用代码
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;   
    case 3:// 3号键
          //在这里添加应用代码
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;   
    case 4:// 4号键
          //在这里添加应用代码
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;
               
}   
         
}

上述代码是常见的按键服务函数里面的switch框架,大家看看,能发现什么问题吗?看看,咋看,风平浪静,啥事都没有。我现在,我把它等效转换成if和else if语句,如下:

void main()
{
   //此处暂时省略了一些代码
   while(1)
   {
       key_service(); //按键服务的应用程序
   }

}

void key_service() //按键服务的应用程序
{

   if(1==ucKeySec)
   {
      //在这里添加应用代码
      ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
   }
   else if(2==ucKeySec)
   {
      //在这里添加应用代码
      ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
   }
   else if(3==ucKeySec)
   {
      ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
   }
   else if(4==ucKeySec)
   {
      ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
   }
         
}


大家假设想想一下,假如你的按键里有48个按键,往里面添加48个else if,当没有按键触发的时候,每次从主循环进入这个函数,都要判断“if和else if"大概48次!如果添加一行代码,让平时没有按键时候只进来判断一次该多好。这个是大家很容易忽略的问题,现在分析给大家,那么这行代码就是在这个函数最上面添加:

if(0==ucKeySec)
{
    return; //直接退出这个函数,后面不需要再多判断它无用的48回
}

完整的代码如下:

void main()
{
   //此处暂时省略了一些代码
   while(1)
   {
       key_service(); //按键服务的应用程序
   }

}
void key_service() //按键服务的应用程序
{

if(0==ucKeySec)//只有老练的工程师才会懂得欣赏这句精妙的语句!
{
   return; //直接退出这个函数,后面不需要再耗时间去轮番逐个判断case
}

switch(ucKeySec) //按键服务状态切换
{
    case 1:// 1号键
          //在这里添加应用代码
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;      
    case 2:// 2号键
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;   
    case 3:// 3号键
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;   
    case 4:// 4号键
          ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
          break;         
}   
         
}


★啦啦-青岛:
switch是只判断一次,IF是逐条判断的吧,两者不一样。

★坚鸿-深圳:
switch语句转换成汇编,它本质是用什么语句实现,这个是问题的关键点。我刚好在网上查看了一下资料。发现不同的C编译器对switch语句的处理是不一样的,主要有两种思路:

第一种:就是等效成if和else if语句那样的汇编代码来处理,这是逐行判断。比如,像下面的就是逐行判断的汇编代码:

上述C语言翻译成汇编如下:


这里的cmp和je的汇编组合语句就相当于C语言的if语句。


第二种:就是用到汇编查表跳转的指令,这种思路不用逐行判断。

综上所述,结论是:不同的C编辑器对switch处理是不一样的,有的是用汇编的查表原理不用逐行判断,有的是用if逐行判断,对于我们,最好做最坏的打算来预防最坏的情况,所以我今天推荐给大家的那一行代码程序,是有必要加上的。

Alex-昆山:
我以前用汇编写过switch语句,就是用查表功能的,如下:


页: [1]
查看完整版本: switch语句等价于if和else if语句吗?用switch在主循环时应注意什么问题?已解答。