跳转至

C语言中的循环语句

约 1454 个字 310 行代码 预计阅读时间 9 分钟

while循环

基本结构

C
1
2
3
4
while(表达式)
{
    //语句
}

基本语法

表达式为执行循环的判断条件,当表达式为真(不为0)时,执行while循环内的语句,表达式为假时,不执行while。并且属于先判断后执行的循环

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
    int i = 0;
    while(i < 10)
    {
        printf("%d ", i);
        i++;//最后i的值将为10,但是循环中打印i只会打印到9
    }
    printf("\n");
    printf("%d", i);
    return 0;
}
输出结果
0 1 2 3 4 5 6 7 8 9
10

在上面的代码中,i=0,小于10执行while循环打印i的值,执行完打印语句后,执行i++更新i的值,防止死循环。

总结:

  1. while循环中,int i = 0;语句执行初始化
  2. while循环中,i < 10表达式作为判断
  3. while循环中,i++用于更新i的值,防止死循环
  4. while循环中,循环体语句总是比判断条件少执行一次

while循环与自增操作结合置于判断条件内

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    //while循环与自增操作结合置于判断条件内
    int i = 0;
    while (i++ < 10)
    {
        printf("%d ", i);//i++先使用后+1,即先比较,比较完之后+1,循环体内语句从1开始打印,一直打印到10,并且循环结束之后i值为11
    }
    putchar('\n');
    printf("%d\n", i);

    int j = 0;
    while (++j < 10)
    {
        printf("%d ", j);//j++先+1再使用,即先+1,再比较,循环体内语句从1开始打印,一直打印到9,并且循环结束之后j值为10
    }
    putchar('\n');
    printf("%d\n", j);

    return 0;
}
输出结果
1 2 3 4 5 6 7 8 9 10
11
1 2 3 4 5 6 7 8 9
10

for循环

基本结构

C
1
2
3
4
for(初始化表达式;判断表达式;更新表达式)
{
    //语句
}

基本语法

第二个表达式为执行循环的判断表达式,当判断表达式为真时,执行for循环;当表达式为假时,不执行for循环

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
    int i = 0;

    for(i = 1; i < 10; i++)
    {
        printf("%d ", i);
    }

    return 0;
}
输出结果
1 2 3 4 5 6 7 8 9

在上面的代码中,i=0,小于10执行for循环打印i的值,执行完打印语句后,执行i++更新i的值,防止死循环。

总结:

  1. for循环中,第一个表达式用于循环变量的初始化
  2. for循环中,第二个表达式用于循环结束条件的判断
  3. for循环中,第三个表达式用于更新循环变量
  4. for循环中,循环变量初始化语句一整个循环执行一次
  5. for循环中,更新循环变量语句在for循环中执行在for循环体语句后
  6. for循环中,如果循环结束条件部分什么也不写表示条件恒成立

for循环与while循环比较

for循环比while循环更集中,将循环变量的初始化、循环结束条件的判断和循环变量的更新放在了一个语句中

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//while循环
    int i = 0;//创建循环变量

    while(i < 10/*判断条件*/)
    {
        printf("%d ", i);
        i++;//循环变量自增
    }
//for循环
    int i = 0;//创建循环变量

    for(i = 0; i < 10/*判断条件*/; i++/*循环变量自增*/)
    {
        printf("%d ", i);
    }

do-while循环

基本结构

C
1
2
3
4
do
{
    //语句
}while(表达式);

基本语法

在进入判断之前,首先会先执行一次循环体,再执行循环判断语句,循环判断为真,执行循环体内语句,循环判断为假,不执行循环体内语句

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
    int i = 1;    
    do
    {
        printf("%d ", i);
        i++;
    }while(i < 10);

    return 0;
}
输出结果
1 2 3 4 5 6 7 8 9

上面的代码中,首先会在判断之前执行一次循环体,然后再执行循环判断语句,首先打印一遍1,再循环打印2—9的数字。每一次循环中,i++语句用于更新循环变量i,而int i = 1;语句用于创建循环变量i

do-while循环与自增操作结合置于判断条件内

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    int i = 0;
    do
    {
        printf("%d ", i);
    } while (i++ < 10);//i++,先使用后+1,即先判断再+1,故循环从0开始打印,一直打印到10,循环结束i为11
    putchar('\n');
    printf("%d\n", i);

    int j = 0;
    do
    {
        printf("%d ", j);
    } while (++j < 10);//++j,先+1再使用,即先+1再判断,故循环从0开始打印,一直打印到9,循环结束j为10
    putchar('\n');
    printf("%d\n", j);

    return 0;
}
输出结果
0 1 2 3 4 5 6 7 8 9 10
11
0 1 2 3 4 5 6 7 8 9
10

循环中的break与continue

循环中break和continue中的作用

break:永久终止循环,直接跳出当前循环,再执行当前循环以外的语句

continue:跳过本次循环中continue后面的代码

while中的break与continue

break

while循环中,break用于跳出当前循环,并执行while循环以外的语句

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main()
{
    int i = 1;
    while(i <= 10)
    {    
        if(i == 5)
        {
            break;
        }
        printf("%d ", i);
        i++;
    }
    printf("结束");

    return 0;
}

在上面的代码中,当i等于5时,if表达式为真,执行if语句中的break,跳出当前的while循环,不再执行循环体内的printf语句与更新循环变量i语句,而执行循环体外的printf语句。

嵌套while循环中的break

在嵌套while循环中,break会跳出包括break语句的一层循环

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>

int main()
{
    int i = 0;
    while(i <= 10)
    {   
        int n = 0; 
        printf("i = %d ", i);
        while(n <= 6)
        {
            if(i == 5)
            {
            break;
            }
            printf("n = %d ", n);
            n++;
        }
        printf("\n");
        i++;
    }
    printf("结束");

    return 0;
}
输出结果
i = 0 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 1 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 2 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 3 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 4 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 5
i = 6 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 7 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 8 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 9 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6
i = 10 n = 0 n = 1 n = 2 n = 3 n = 4 n = 5 n = 6

i5时不打印n的值,即跳出了内层while循环执行外层while循环中的语句。

continue

while循环中,continue用于跳过当前循环中continue后面的语句,但是注意,如果更新循环变量语句在cotinue后面会造成死循环

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
    int i = 1;
    while(i <= 10)
    {
        if(i == 5)
        {
            continue;
        }
        printf("%d ", i);
        i++;
    }

    return 0;
}

在上面的代码中,当i等于5时执行continue语句,跳过当前循环中的printf语句和更新循环变量语句i++,并执行循环判断表达式,此时由于i中的值始终为5,导致循环判断表达式始终为真,进而导致进入死循环,所以在while语句中需要用continue语句的时候需要注意更新循环变量语句需要在continue语句前面。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main()
{
    int i = 1;
    while(i <= 10)
    {
        i++;//更新循环变量语句需要在continue语句前面
        if(i == 5)
        {
            continue;
        }
        printf("%d ", i);
    }

    return 0;
}
输出结果
2 3 4 6 7 8 9 10 11

for循环中的break与continue

break

for循环中的break语句与while循环中的break语句作用效果一样。

嵌套for循环中的break

嵌套for循环中的break语句与嵌套while循环中的break语句作用效果一样

continue

由于for循环中的更新循环变量表达式在for表达式内,而不是在循环体内,所以for循环中的continue语句效果和while循环中的continue语句会有一些差异

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
    int i = 0;
    for(i = 1; i <= 10; i++)
    {
        if(i == 5)
        {
            continue;
        }
        printf("%d ", i);
    }
    printf("结束");

    return 0;
}

while循环不同,上面的代码并没有进入死循环,而是打印了除5以外的1-10的数字。

由于更新循环变量表达式i++for循环表达式中,而不是在循环体内,所以执行continue语句后会执行更新循环变量表达式i++,从而不会造成死循环。

do-while循环中的break与continue

break

do-while循环中的break语句与while循环中的break语句作用效果一样。

continue

do-while循环中的continue语句与while循环中的continue语句作用效果一样。

goto语句

作用

goto语句可以实现在同一个函数内跳转到设置好的标记处

例如:

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
    printf("Hello");

    goto next;

    printf("my");

next:
    printf("world");

    return 0;
}

在上面的代码中,先执行printf语句,接下来遇到goto语句,标记为next,跳到并执行next标记下的printf语句,整个过程中不执行printf("my");,在多层循环中,若想一次性跳出所有循环可以用goto循环

循环体内的变量可否访问

while循环

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//while循环中的变量
#include <stdio.h>

int main()
{
    int i = 0;//属于main函数中的变量,整个main函数中均可以使用
    while (i <= 10)
    {
        int n = 0;
        printf("%d ", i);
        printf("\n");
        while (n < 10)
        {
            int j = 0;//定义在内层循环的变量
            printf("n = %d ", n);
            printf("i = %d", i);
        }
        printf("\n");
        //printf("j = %d ", j);
        //j变量是在内层循环中定义的变量,外层循环中无法访问
    }
    printf("i = %d ", i);
    /*n与j变量是在循环中定义的变量,在循环体外无法访问*/
    //printf("n = %d ", n);
    //printf("j = %d ", j);

    return 0;
} 

for循环

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
    int i = 0;//属于main函数中的变量,整个main函数中均可以使用
    for (i = 1; i <= 10; i++)
    {
        printf("i = %d ", i);
        for (int n = 0; n <= 10; n++)//定义在循环表达式的变量
        {
            int j = 0;//定义在内层循环的变量
            printf("n = %d", n);
            printf("i = %d", i);
        }
        //printf("n = %d", n);变量n虽然是在循环表达式中定义的变量,但是仍然无法在内层外访问
    }

    printf("i = %d", i);
    /*n变量和j变量定义在循环内部,在循环外无法访问*/
    //printf("n = %d", n);
    //printf("j = %d", j);

    return 0;
}

do-while循环

while循环相同