4.1.7 程序跳转语句

程序跳转语句主要用于控制程序执行流程,跳转或改变程序的执行顺序。在C51语言中,主要包括3种跳转语句:goto语句、break语句和continue语句。下面分别进行介绍。

1.goto语句

goto语句是一个无条件的转向语句,其一般形式如下。


goto语句标号;


其中,语句标号为一个带冒号的有效标识符。在C51中执行到这个语句时,程序指针就会无条件地跳转到goto后的标号所指向的程序段。goto语句的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

int i=0,total=0;

loop://语句标号

total=total+i;//执行运算

i++;

if(i<101)//如果i<101则转向loop处

goto loop;//转向loop处继续执行

printf(“1+2+……+100=%d\n”,total);//输出求和结果

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


1+2+……+100=5050


本程序用来计算1加到100的总和。程序中首先定义了一个loop语句标号,然后执行累计求和运算,接着判断变量,当i的值小于101的时候,程序执行goto语句无条件跳转到loop标号处继续执行,实现求和运算,最后输出结果。

在C51程序中使用goto语句进行程序设计时,需要注意如下几点。

❑goto语句后面语句标号的定义应遵循C51标识符定义原则。

❑语句标号不能使用C51的关键字,也不能和其他变量和函数同名。

❑标号必须和goto语句处于同一函数中,可以不在同一个循环中。

❑goto语句常与if语句连用,当满足某一条件时,程序自动跳转到标号处执行。

❑goto语句可以从内层循环跳到外层循环,而不能从外层循环跳到内层循环中。

❑在结构化程序设计时,对goto语句应当慎用,过多地使用会使程序结构不清晰。因为goto语句破坏了程序的模块化结构,使程序可读性变差,增加维护的难度。但在多层嵌套退出时,用goto语句较合理。

2.break语句

break语句通常是用来跳出循环程序块,一般用在循环语句和开关语句中。break语句的一般形式如下所示。


break;


在C51程序中,break语句通常用于以下两种情况。

❑在for、while、do-while循环语句中,break语句和if语句一起使用,当满足一定条件时便跳出循环体。

❑在switch开关语句中使用break语句,可使程序跳出switch语句,执行switch语句后续的程序代码。如果没有break语句,则switch语句将成为一个死循环而无法退出。

注意对于多重循环嵌套时,使用break语句只能跳出当前循环,而不会跳出所有外层循环。

break语句的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

int i,total;//声明变量

i=0;//变量初始化

total=0;

while(1)//while循环

{

total=total+i;//累加求和

i++;

if(i>100)//判断i是否大于100

break;//跳出while循环

}

printf(“1+2+……+100=%d\n”,total);//输出求和结果

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


1+2+……+100=5050


本程序用来计算1加到100的总和。程序中首先声明并初始化变量i和total,然后在while循环语句中执行累计求和运算,其中判断i是否大于100,如果为真则执行break语句跳出while循环。最后输出结果。

在C51程序设计中使用break语句时,要注意以下几点。

❑break语句只适用于单分支的if条件语句,对于多分支的if条件语句不起作用。

❑如果遇到多层循环嵌套的情况,一个break语句只能向外跳出一层循环。如果需要跳出多层循环,需要多次在每层循环中使用break语句。

3.continue语句

continue语句用来执行跳过循环体中剩余的语句,而强行执行下一次循环的操作。continue语句使用的一般形式如下。


continue;


在C51中,continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,可以提前结束本次循环。continue语句的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

char ch[]={‘a','B','c','D','e','F’};//初始化字符数组

int i=-1;

while(i<5)//进入循环

{

i++;

if(ch[i]>=‘a'&&ch[i]<='z’)//是否为小写字符

continue;//如果是,则退出本次循环,进入下次循环

printf(“ch[%d]=%c\n”,i,ch[i]);//输出字符数组中的大写字符

}

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


ch[1]=B

ch[3]=D

ch[5]=F


在本例中,首先声明并初始化了一个字符数组ch,然后在while语句中逐个判断每个字母是否是小写,如果是小写字母则使用continue语句退出本次循环,继续执行下次循环,否则将打印输出所有的大写字母。