第五十节: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。 下节预告:空返回空形参的函数。 (未完待续)
|