break是跳出当前循环还是所有循环_C语言迭代循环控制的两个辅助关键词:continue和break

一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue和break语句可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。

continue语句

3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环。以下简短程序演示了如何使用continue。

/* skippart.c  -- uses continue to skip part of loop */#include 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;  // jumps to while loop test condition        }        printf("Accepting %0.1f:", 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, total / n);        printf("Low = %0.1f, high = %0.1f", min, max);    }    else        printf("No valid scores were entered.");    return 0;}

while循环读取输入,直至用户输入非数值数据。循环中的if语句筛选出无效的分数。假设输入188,程序会报告:188 is an invalid value。在本例中,continue语句让程序跳过处理有效输入部分的代码。程序开始下一轮循环,准备读取下一个输入值。

注意,有两种方法可以避免使用continue,一是省略continue,把剩余部分放在一个else块中:

if (score < 0 || score > 100)    /* printf() statement */else{    /* statements */}

另一种方法是,用以下格式来代替:

if (score >= 0 && score <= 100){   /* statements */}

这种情况下,使用continue的好处是减少主语句组中的一级缩进。当语句很长或嵌套较多时,紧凑简洁的格式提高了代码的可读性。

continue还可用作占位符。例如,下面的循环读取并丢弃输入的数据,直至读到行末尾:

while (getchar() != '');

这种情况下,使用continue的好处是减少主语句组中的一级缩进。当语句很长或嵌套较多时,紧凑简洁的格式提高了代码的可读性。continue还可用作占位符。例如,下面的循环读取并丢弃输入的数据,直至读到行末尾:

while (getchar() != '')continue ;

如果用了continue没有简化代码反而让代码更复杂,就不要使用continue。例如,考虑下面的程序段:

while ((ch = getchar() ) != ''){    if (ch == 't')        continue;    putchar(ch);}

该循环跳过制表符,并在读到换行符时退出循环。以上代码这样表示更简洁:

while ((ch = getchar()) != '')    if (ch != 't')        putchar(ch);

通常,在这种情况下,把if的测试条件的关系反过来便可避免使用continue。

以上介绍了continue语句让程序跳过循环体的余下部分。那么,从何处开始继续循环?对于while和do-while循环,执行continue语句后的下一个行为是对循环的测试表达式求值。考虑下面的循环:

count = 0;while (count < 10){    ch = getchar();    if (ch == '')        continue;    putchar(ch);    count++;}

该例中,执行完continue后,首先递增count,然后将递增后的值和10作比较。因此,该循环与上面while循环的例子稍有不同。while循环的例子中,除了换行符,其余字符都显示;而本例中,换行符也计算在内,所以读取的10个字符中包含换行符。

break语句

程序执行到循环中的break语句时,会终止包含它的循环,并继续执行下一阶段。把程序清单7.9中的continue替换成break,在输入188时,不是跳至执行下一轮循环,而是导致退出当前循环。图7.3比较了break和continue。如果break语句位于嵌套循环内,它只会影响包含它的当前循环。

6468f0e8a657fe726d26981875a92811.png

Comparing break and continue

break还可用于因其他原因退出循环的情况。程序清单7.10用一个循环计算矩形的面积。如果用户输入非数字作为矩形的长或宽,则终止循环。

/* break.c -- uses break to exit a loop */#include int main(void){    float length, width;    printf("Enter the length of the rectangle:");    while (scanf("%f", &length) == 1)    {        printf("Length = %0.2f:", length);        printf("Enter its width:");        if (scanf("%f", &width) != 1)            break;        printf("Width = %0.2f:", width);        printf("Area = %0.2f:", length * width);        printf("Enter the length of the rectangle:");    }    printf("Done.");    return 0;}

可以这样控制循环:

while (scanf("%f %f", &length, &width) == 2)

但是,用break可以方便显示用户输入的值。和continue一样,如果用了break代码反而更复杂,就不要使用break。例如,考虑下面的循环:

while ((ch = getchar()) != ''){   if (ch == 't')         break;   putchar(ch);}

如果把两个测试条件放在一起,逻辑就更清晰了:

while ((ch = getchar() ) != '' && ch != 't')      putchar(ch);

break语句对于稍后讨论的switch语句而言至关重要。

在for循环中的break和continue的情况不同,执行完break语句后会直接执行循环后面的第1条语句,连更新部分也跳过。嵌套循环内层的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;           // break from inner loop        scanf("%d", &q);    }    if (q > 100)        break;               // break from outer loop    scanf("%d", &p);}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值