| 本帖最后由 jianhong_wu 于 2015-12-14 23:16 编辑 
 
 第五十节:switch语句。          switch是非常重要的语句,我几乎所有的单片机项目都是用switch搭建程序主框架。如果说while和for是一对孪生兄弟,那么if-elseif和switch也是一对孪生兄弟,凡是用switch语句能实现的功能都可以用if-elseif实现。switch有条件分支的功能,在条件超过3个以上的条件分支功能里,switch书写会比if-else if更加直观清晰。          50.1      switch语句的语法          以下是switch语句常见的格式: 
 switch(变量)    //根据变量的数值大小从对应的case入口进来 {      case 0:   //入口0          语句0;          break; //switch程序体的出口之一      case 1:  //入口1          语句1;          break; //switch程序体的出口之一      case 2: //入口2          语句2;          break; //switch程序体的出口之一 }    //最下面的花括号也是一个switch程序体的出口之一 
         执行顺序分析:         单片机从switch(变量)进来,根据变量的数值大小,进入对应的case入口里。假如变量等于1,就直接进入到case 1入口,执行“语句1”后,遇到break语句就跳出整个switch程序体。假如变量等于3,单片机从switch(变量)进来,因为没有发现case 3,所以直接跳出switch程序体没有执行任何语句。多补充一句,在case 2选项中,语句2最后的break可以省略,因为case 2是最后一个case,即使没有遇到break也会遇到最下面的花括号而跳出switch程序体。上述程序功能如果用if-elseif语句来实现如下: 
 if(变量==0) {     语句0; } else if(变量==1) {     语句1; } else if(变量==2) {     语句2; } 
 
         50.2      switch语句的break         大家从50.1的例子中看到了三个关键字分别是:switch,case,break。其实并不是每个case都必须要break配套,break只是起到一个出口的功能。假如没有遇到break,程序会一直往下执行,直到遇到break或者switch最下面的花括号为止。比如: 
 switch(变量)    //根据变量的数值大小从对应的case入口进来 {      case 0:   //入口0          语句0;          break;       case 1:  //入口1          语句1;      case 2: //入口2          语句2;          break;       case 3: //入口3          语句3;          break;  }   //最下面的花括号也是一个switch程序体的出口之一 
         执行顺序分析:         假如此时switch(变量)的变量等于1,就直接进入到case 1入口,执行“语句1”后,没有遇到break语句,继续执行“语句2”,紧接着遇到break语句,才跳出整个switch程序体。本例子中case 1没有break语句,就继续往下执行下面case2里面的语句,直到遇到break或者最下面的花括号为止。 
         50.3      switch语句的case有规定顺序吗?必须连贯吗? switch程序体内部可以写很多case入口,这些case入口是不是必须按从小到大的顺序?是不是规定必须case数字连贯?答:没有规定顺序,也没有规定case数字连贯,case的数值只是代表入口。比如以下两种写法都是合法的: 
         50.3.1    case不按从小到大的顺序: 
 switch(变量)    {      case 2:           语句2;          break;       case 0:            语句0;          break;      case 1:            语句1;          break; }    
          50.3.2    case的数字不连贯 switch(变量)    {     case 0:            语句0;          break;      case 3:           语句3;          break;       case 9:            语句9;          break; }    
 
          50.4      switch语句的default。          default和break一样,也不是必须的语句,应根据程序需要来选择。default相当于if-else if-else 语句中的else,也就是当switch(变量)的变量没有匹配的case入口时,就会默认进入default入口,就像if-else if-else 语句中当前面所有的条件不满足时,就进入else语句的程序体,比如: 
 switch(变量)    //根据变量的数值大小从对应的case入口进来 {      case 0:   //入口0          语句0;          break; //switch程序体的出口之一      case 1:  //入口1          语句1;          break; //switch程序体的出口之一      case 2: //入口2          语句2;          break; //switch程序体的出口之一      default:  //当所有的case不满足,就进入default入口          语句3;          break; }    //最下面的花括号也是一个switch程序体的出口之一 
         执行顺序分析:         假如switch(变量)的变量等于35,因为没有找到case 35,所以就直接从默认的default入口进来执行” 语句3”,然后遇到break语句就跳出switch程序体。上述程序功能如果用if-elseif-else语句来实现如下: 
 if(变量==0) {     语句0; } else if(变量==1) {     语句1; } else if(变量==2) {     语句2; } else   //相当于switch中的default {     语句3; } 
 
          50.5      switch语句中内嵌switch          if语句也可以内嵌if语句,while语句也可以内嵌while语句,switch语句当然也可以内嵌switch。比如 
 switch(a) {    case 1:         switch(b)         {              case 1:                   Break;              case 2:                   Break;         }         Break;    case 2:         Break; } 
        这种switch内嵌switch语句也是合法的,而且在实际项目中也很常用,大家目前先有个大概的了解即可,暂时不深入讲解。 
         50.6      switch练习程序        现在编写一个switch的练习程序,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下: 复制代码
void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
  unsigned char k;   //此变量为switch的入口判断变量
  unsigned char a; //观察此变量的变化来理解switch的执行顺序
 
  a=0; 
  k=2; 
  switch(k)
  {
     case 0:  //入口0
       a++;
       break; //跳出switch
     case 1:  //入口1
       a++;
     case 2:  //入口2,上述k等于2所以从这里进来
       a++;
     case 3:  //入口3
       a++;
     case 4:  //入口4
       a++;
       break;  //跳出switch
     case 5:  //入口5
       a++;
       break;  //跳出switch
     default: //入口default,相当于else。当前面没有遇到对应的case入口时,就默认进入此default入口
       a++;
       break;  //跳出switch
  }            //最后一个switch的花括号也是跳出switch
      
  GuiWdData0=a;   //把a这个变量放到窗口变量0里面显示
  
        
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
   while(1)  
   { 
      initial(); 
      key_service();
      display_service(); 
   }
}
 
         查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。16个LED灯显示的就是当前变量的二进制数,亮代表1,灭代表0。上坚鸿51学习板观察程序执行的结果如下:         变量a为3。         下节预告:空返回空形参的函数。 (未完待续)       
 |