7.6.1 continue语句
该语句可以用于三种循环形式。
当运行到该语句时,它将导致剩余的迭代部分被忽略,并开始下一次的迭代。
如果continue语句处于嵌套结构中,它仅仅影响它的最里层的结构。
程序清单7.9 skippart.c
/*skippart.c--使用continue跳过部分循环*/
#include <stdio.h>
int main (void)
{
const float MIN = 0.0f;
const float MAX = 100.0f;
float score;
float total = 0.0f;
int n = 0;
float min = MAX;
float max = MIN;
printf("Enter the first score (q to quit):");
while(scanf("%f",&score)==1)
{
if(score<MIN || score>MAX)
{
printf("%0.1f is an invalid value.Try again:",score);
continue;
}
printf("Accepting %0.1f: \n",score);
min = (score<min)?score:min;
max = (score>max)?score:max;
total += score;
n++;
printf("Enter next score (q to quit):");
}
if(n>0)
{
printf("Average of %d scores is %0.1f.\n",n,total / n);
printf("Low = %0.1f,high = %0.1f \n",min,max);
}
else
printf("No valid scores were entered.\n");
return 0;
}
如果程序输入188,那么程序就会说明:188 is an invalid value.然后,continue语句导致程序跳过循环其余用于处理有效输入的部分。开始下一个循环周期,试图读取下一次输入值。
在这种情况下,使用continue的一个好处是可以在主语句中消除一级缩排。增强可读性。
continue的另一个用处是作为占位符。例如,下面的循环读取并丢弃输入,直到一行的末尾(包括行尾字符):
while (getchar()!='\n')
;
当程序已经从一行中读取了一些输入并需要跳到下一行的开始时,使用上面的语句很方便。问题是孤立的分号难以被注意。如果使用continue,代码就更具有可读性,如下所示:
while (getchar()!='\n')
continue;
当然,如果它不是简化了代码,而是使代码更加复杂了,就不要使用continue.
您已经看到了continue语句导致循环体的剩余部分被跳过。那么在什么地方继续循环呢?
对于while和do while循环,continue语句之后发生的动作是求循环判断表达式的值。考虑下面的循环体:
int count = 0;
char ch;
while(count < 10)
{
ch = getchar();
if(ch=='\n')
continue;
putchar(ch);
count++;
}
它读取10个字符(换行符除外,因为当ch为换行符时会跳过count++;语句)并回显它们,其中不包括换行符。continue被执行时,下一个被求值 的表达式是循环判断条件。
对于for循环,下一个动作是先求更新表达式的值,然后再求循环判断表达式的值。考虑下面的循环体:
for(count = 0;count<10;conut++)
{
ch = getchar();
if(ch=='\n')
continue;
putchar(ch);
}
在本例中,当continue语句被执行时,首先递增count,然后把count与10相比较。因此,这个循环的动作稍不同于while循环的例子。像前面那样,仅仅显示非换行字符,但这时换行字符也被包括在计数中,因此它读取包括换行字符在内的10个字符。
7.6.2 break语句
循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段。
如果break位于嵌套循环里,它只影响包含它的最里面的循环。
有时,break被用于在出现其他原因时退出循环。
程序7.10用一个循环计算矩形的面积,如果用户输入一个非数字作为矩形的长度或宽度,那么循环终止。
/*break.c--使用break退出循环*/
#include <stdio.h>
int main(void)
{
float length,width;
printf("Enter the length of the rectangle:\n");
while(scanf("%f",&length)==1)
{
printf("Length = %0.2f: \n",length);
printf("Enter its width: \n");
if(scanf("%f",&width)!=1)
break;
printf("Width = %0.2f: \n",width);
printf("Area = %0.2f \n",length*width);
printf("Enter the length of the rectangle: \n");
}
printf("Done.\n");
return 0;
}
也可以这样控制循环:
while(scanf("%f %f",&length,&width)==2)
但是,使用break可以使单独回显每个输入值更加方便。
和continue一样,当break使代码更加复杂时不要使用它。
注意:break语句使程序直接转到紧接着该循环后的第一条语句去执行;在for循环中,与continue不同,控制段的更新部分也将被跳过。嵌套循环中的break语句只是使程序跳出里层的循环,要跳出外层的循环,则还需要另外一个break.
int p,q;
scanf("%d",&p);
while(p>0)
{
printf("%d",p);
scanf("%d",&q);
while(q>0)
{
printf("%d",p*q);
if(q>100)
break; //跳出里层循环
scanf("%d",&q);
}
if(q>100)
break; //跳出外层循环
scanf("%d",&p);
}
来源:oschina
链接:https://my.oschina.net/u/2754880/blog/694001