1、break语句
注1:前面讲for语句循环结构时,说了“表达式2“也是可以省略就是死循环了,解决办法是在循环体中加入if...break。
#include "stdio.h"
int main()
{
int i=1, sum=0; //循环初始条件
for(;;) //这里没有循环判定条件,所以这里是恒真的,与for(;1;)是等同的
{
if(i>100) break; //循环判定条件,当i>100跳出for循环,否则继续循环
sum+=i; //循环体
i++; //循环修正条件
}
printf("1+2+3+...+100=%d",sum);
return 0;
}
注2:for(;;)是恒真的,那就相当于while(1),所以上面代码可以变成while(1)形式,这也是一种常用方法。
#include "stdio.h"
int main()
{
int i=1, sum=0; //循环初始条件
while(1) //这里没有循环判定条件,所以这里是恒真的,与for(;1;)是等同的
{
if(i>100) break; //循环判定条件,当i>100跳出for循环,否则继续循环
sum+=i; //循环体
i++; //循环修正条件
}
printf("1+2+3+...+100=%d",sum);
return 0;
}
注3:不管是循环结构还是switch结构,break只能跳出一层结构。下面举一个简单例子来说明:计算i*j的值,但是不计算自已乘自己。
#include "stdio.h"
int main()
{
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
if(j==i) break;
printf("i=%d,j=%d,i*j=%d\n",i,j,i*j);
}
}
return 0;
}
从上面结果, 当j==i时,只跳出内层for结构。
2、continue语句
注1: 一般地,continue语句都会位于一个if语句中,即当满足某一条件时,结束本轮次循环(即跳过本轮次continue后面部分),进入下一轮次循环。
例如:打印出除5之外的10以内的自然数。
#include "stdio.h"
int main()
{
int x;
for(x=1;x<=10;x++)
{
if (x==5)
continue;
printf("%3d",x);
}
return 0;
}
注2:在while 和do-while语句中,执行continue语句就立即去测试是否继续循环的条件。
#include "stdio.h"
int main()
{
int i=1, sum=0; //循环初始条件
while(i<=10) //循环判定条件
{
if(i==5) continue; //执行后立即跳至i<=10判定,由于i++没有执行,所以一直停留在i=5,从而死循环
sum+=i; //循环体
i++; //循环修正条件
}
printf("1+2+3+4=%d",sum);
return 0;
}
#include "stdio.h"
int main()
{
int i=1, sum=0; //循环初始条件
do
{
if(i==5) continue; //执行后立即跳至i<=10判定,由于i++没有执行,所以一直停留在i=5,从而死循环
sum+=i; //循环体
i++; //循环修正条件
}while(i<=10); //循环判定条件
printf("1+2+3+4=%d",sum);
return 0;
}
执行continue后立即跳至i<=10判定,由于i++没有执行,所以一直停留在i=5,从而死循环。
注3:但是在for语句中,执行continue语句立即计算表达式3,然后计算表达式2测试继续循环的条件,这与上面是有区别的。
#include "stdio.h"
int main()
{
int i, sum=0;
for(i=1;i<=10;i++) //循环初始条件、循环判定条件、循环修正条件
{
if(i==5) continue; //执行后立即跳至i<=10判定,由于i++没有执行,所以一直停留在i=5,从而死循环
sum+=i; //循环体
}
printf("1+2+3+4+6+7+8+9+10=%d",sum);
return 0;
}
从上面来看,只跳过了5没有加进sum。
3、break和continue的流程图对比
从这两个图可以看出, break和continue跳出后,到达什么位置。