概述
C语言学习栏目目录
目录
1 continue语句
2 break语句
源码
一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue 和break语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。
1 continue语句
3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环。下程序清单中的简短程序演示了如何使用continue。
/************************************************************************
功能: 使用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("输入第一个分数(q表示退出): ");
while (scanf("%f", &score) == 1)
{
if (score < MIN || score > MAX)
{
printf("%0.1f 是无效值,请重新输入: ", score);
continue; // 跳转至while循环的测试条件
}
printf("有效值 %0.1f:n", score);
min = (score < min) ? score : min;
max = (score > max) ? score : max;
total += score;
n++;
printf("输入下一个分数(q表示退出): ");
}
if (n > 0)
{
printf(" %d 个分数的平均值是 %0.1f.n", n, total / n);
printf("最低分 = %0.1f, 最高分 = %0.1fn", min, max);
}
else
printf("未输入有效分数。n");
return 0;
}
在程序清单中,while循环读取输入,直至用户输入非数值数据。循环中的if语句筛选出无效的分数。假设输入 150,程序会报告:150.0 是无效值,请重新输入。在本例中,continue 语句让程序跳过处理有效输入部分的代码。程序开始下一轮循环,准备读取下一个输入值。输出结果如下
输入第一个分数(q表示退出): 15
有效值 15.0:
输入下一个分数(q表示退出): 584
584.0 是无效值,请重新输入: 45
有效值 45.0:
输入下一个分数(q表示退出): 85
有效值 85.0:
输入下一个分数(q表示退出): 100
有效值 100.0:
输入下一个分数(q表示退出): 150
150.0 是无效值,请重新输入: q
4 个分数的平均值是 61.3.
最低分 = 15.0, 最高分 = 100.0
注意,有两种方法可以避免使用continue,一是省略continue,把剩余部分放在一个else块中:
if (score < 0 || score > 100)
/* printf()语句 */
else
{
/* 语句*/
}
另一种方法是,用以下格式来代替:
if (score >= 0 && score <= 100)
{
/* 语句 */
}
这种情况下,使用continue的好处是减少主语句组中的一级缩进。当语句很长或嵌套较多时,紧凑简洁的格式提高了代码的可读性。continue还可用作占位符。例如,下面的循环读取并丢弃输入的数据,直至读到行末尾:
while (getchar() != 'n')
;
当程序已经读取一行中的某些内容,要跳至下一行开始处时,这种用法很方便。问题是,一般很难注意到一个单独的分号。如果使用continue,可读性会更高:
while (getchar() != 'n')
continue;
如果用了continue没有简化代码反而让代码更复杂,就不要使用continue。例如,考虑下面的程序段:
while ((ch = getchar() ) != 'n')
{
if (ch == 't')
continue;
putchar(ch);
}
该循环跳过制表符,并在读到换行符时退出循环。以上代码这样表示更简洁:
while ((ch = getchar()) != 'n')
if (ch != 't')
putchar(ch);
通常,在这种情况下,把if的测试条件的关系反过来便可避免使用continue。以上介绍了continue语句让程序跳过循环体的余下部分。那么,从何处开始继续循环?对于while和 do while 循环,执行 continue 语句后的下一个行为是对循环的测试表达式求值。考虑下面的循环:
count = 0;
while (count < 10)
{
ch = getchar();
if (ch == 'n')
continue;
putchar(ch);
count++;
}
该循环读取10个字符(除换行符外,因为当ch是换行符时,程序会跳过count++;语句)并重新显示它们,其中不包括换行符。执行continue后,下一个被求值的表达式是循环测试条件。
对于for循环,执行continue后的下一个行为是对更新表达式求值,然后是对循环测试表达式求值。例如,考虑下面的循环:
for (count = 0; count < 10; count++)
{
ch = getchar();
if (ch == 'n')
continue;
putchar(ch);
}
该例中,执行完continue后,首先递增count,然后将递增后的值和10作比较。因此,该循环与上面while循环的例子稍有不同。while循环的例子中,除了换行符,其余字符都显示;而本例中,换行符也计算在内,所以读取的10个字符中包含换行符。
2 break语句
程序执行到循环中的break语句时,会终止包含它的循环,并继续执行下一阶段。把上程序清单中的continue替换成break,在输入150时,不是跳至执行下一轮循环,而是导致退出当前循环。下图比较了break和continue。如果break语句位于嵌套循环内,它只会影响包含它的当前循环。
break还可用于因其他原因退出循环的情况。下程序清单用一个循环计算矩形的面积。如果用户输入非数字作为矩形的长或宽,则终止循环。
/************************************************************************
功能:使用 break 退出循环
/************************************************************************/
#include <stdio.h>
int main(void)
{
float length, width;
printf("输入矩形的长度:n");
while (scanf("%f", &length) == 1)
{
printf("长 : %0.2f:n", length);
printf("输入它的宽:n");
if (scanf("%f", &width) != 1)
break;
printf("宽: %0.2f:n", width);
printf("面积: %0.2f:n", length * width);
printf("输入矩形的长度:n");
}
printf("完成.n");
return 0;
}
可以这样控制循环:
while (scanf("%f %f", &length, &width) == 2)
但是,用break可以方便显示用户输入的值。和continue一样,如果用了break代码反而更复杂,就不要使用break。例如,考虑下面的循环:
while ((ch = getchar()) != 'n')
{
if (ch == 't')
break;
putchar(ch);
}
如果把两个测试条件放在一起,逻辑就更清晰了:
while ((ch = getchar() ) != 'n' && ch != 't')
putchar(ch);
break语句对于稍后讨论的switch语句而言至关重要。
在for循环中的break和continue的情况不同,执行完break语句后会直接执行循环后面的第1条语句,连更新部分也跳过。嵌套循环内层的break只会让程序跳出包含它的当前循环,要跳出外层循环还需要一个break:
int p, q;
scanf("%d", &p);
while (p > 0)
{
printf("%dn", p);
scanf("%d", &q);
while (q > 0)
{
printf("%dn", p*q);
if (q > 100)
break; // 跳出内层循环
scanf("%d", &q);
}
if (q > 100)
break; // 跳出外层循环
scanf("%d", &p);
}
最后
以上就是轻松茉莉为你收集整理的8.6 循环辅助:continue和breakC语言学习栏目目录源码的全部内容,希望文章能够帮你解决8.6 循环辅助:continue和breakC语言学习栏目目录源码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复