更加灵活的利用循环

我们刚才讲了,如何使用 C 语言中的两种循环语句,For循环do...while循环,那么这些循环能否像if...else...语句一样能够彼此嵌套呢?答案是肯定到,循环也可以进行嵌套,并且通过嵌套,我们可以更加灵活的使用循环的各种特点。当然了,我们甚至也可以改变循环的执行状态,让循环在我们需要的时候跳出。

几种循环的比较

首先我们先看看几种循环的比较,找到这些循环的特点。
1、三种循环的运行机制都差不多,计次、执行循环体、增量变量,所以可以相互替换使用。
2、while 循环do...while循环都是在 while 后面的括号中增加判断条件,来判断是否执行下一轮循环,所以在循环体中,要对这个判断条件施加一些设定,让循环能够及时的退出。
3、凡是用 while 循环写的,都可以用 for 循环实现。
4、while 循环do...while循环for 循环都可以使用 break 语句跳出循环,使用 continue 语句结束本次循环。(这两个语句详见下方)

循环的嵌套

在一个循环体内包含另一个完整的循环体,这就是循环的嵌套了。

循环嵌套举例

while 循环do...while循环以及for 循环三者彼此之间都可以进行嵌套

while 里可以是:while、do…while、for;
do…while 里可以是:while、do…while、for;
for 里可以是:while、do…while、for;

所以我们所有学过的循环都可以进行嵌套。我们利用嵌套的方式,编写一个九九乘法表

#include <stdio.h>
int main(){
for (int i=1;i<=9;i++){
    for(int k=1;k<=i;k++){
    printf("%d X %d = %d\t",i,k,i*k);
        }
        printf("\n");
    }
    return 0;
}

我们看到,利用嵌套可以更加灵活的使用循环,但是如何能够在我们需要的时候跳出循环呢?

break 语句提前终止循环

break 语句是控制循环执行状态的终止语句,break 语句可以用来从循环体内跳出循环体,即提前结束当前循环,执行下面的语句。

举例说明

问题

每个人往盒子里放米粒,第一个人放1粒米,第二个人放2粒米…以此类推,一共100个人,直到盒子里有200粒米的时候,就停止放米,这样一共需要多少人?

思路

我们利用循环和 break 跳出,循环次数是100,跳出条件是盒子里的米粒等于200。

#include <stdio.h>
int main(){
    int rice=0,people;
    for(people=1;people<=100;people++){
        rice=rice+people;
        printf("%d个人,%d 粒米\n",people,rice);
        if(rice>=200){
            break;
        }
    }
    printf("200粒米需要%d个人\n",people);
    return 0;
}

运行结果是

1个人,1 粒米
2个人,3 粒米
3个人,6 粒米
4个人,10 粒米
5个人,15 粒米
6个人,21 粒米
7个人,28 粒米
8个人,36 粒米
9个人,45 粒米
10个人,55 粒米
11个人,66 粒米
12个人,78 粒米
13个人,91 粒米
14个人,105 粒米
15个人,120 粒米
16个人,136 粒米
17个人,153 粒米
18个人,171 粒米
19个人,190 粒米
20个人,210 粒米
200粒米需要20个人
Program ended with exit code: 0

使用

本来for 循环要执行100次的,但是我们在循环体中增加了判断循环跳出的条件,如果条件满足,则马上跳出,不管循环了多少次,如果条件不满足,那么循环100次后也会跳出,所以,利用循环体内的 break,我们可以更灵活的使用循环。

注意
break 语句,只能在 switch 语句和循环语句中使用,不能单独使用。

continue 语句提前结束本次循环

注意,我们不是要跳出循环,而是结束本次循环,结束后接着进行下一次循环。

举例说明

问题

找出1~100之间,能被2和3整除的数,并且输出。

思路

我们需要遍历1~100,然后对每个数进行判断,如何复合要求,那么我们就执行输出,如果不符合要求,就跳过该次循环。

#include <stdio.h>
int main(){
    for(int i=1;i<=100;i++){
        if(i%2==0 && i%3==0){
            printf("%d\n",i);
        }else{
            continue;
        }
    }
    return 0;
}

解释

首先利用 for 循环遍历了1~100的所有数,在循环体中,增加if 判断,如果满足条件的,则输出,不满足的则跳过该循环。

break 和 continue 的区别

最大的区别就是 break 是跳出循环体,而 continue 是跳出循环体内的这次循环。

嵌套循环的 break?

如果是嵌套循环,在内循环里面增加了 break,那么执行 break 后,程序会结束内循环还是内外循环都结束呢?

举例

int main(){
    int n=1;
    for (int i=1;i<=4;i++){
        for (int k=1;k<=5;k++,n++){
            printf("%d\t",n);
            if(n%5==0){
                n++;
                break;
            }
        }
         printf("\n");
        if(n>=20){
            break;
        }
    }
    return 0;
}

从上面的例子不难看出,每次需要换行的时候,都执行了 break,这样循环跳出到了外面的大循环,执行了外面的\n然后继续进入下一次循环。
所以,break 和 continue都是仅在当前的循环体内有效

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。