Skip to content

循环

在C语言中,循环语句用于重复执行一段代码,直到满足特定条件为止。循环是程序设计中非常重要的概念,它可以帮助我们处理重复性的任务,减少代码冗余。在本章节中,我们将学习C语言中的各种循环语句及其使用方法。

1. 为什么需要循环?

循环语句在以下场景中特别有用:

  • 重复执行相同的操作:如计算1到100的和
  • 处理批量数据:如遍历数组中的所有元素
  • 等待特定条件:如等待用户输入正确的值
  • 实现菜单系统:如重复显示菜单直到用户选择退出

2. while循环

while循环是C语言中最基本的循环语句,用于当条件为真时重复执行代码块

2.1 语法

c
while (条件) {
    // 循环体:条件为真时执行的代码
}

2.2 执行流程

  1. 检查条件是否为真(非0)
  2. 如果条件为真,执行循环体
  3. 执行完循环体后,回到步骤1,再次检查条件
  4. 如果条件为假,退出循环

2.3 示例

c
#include <stdio.h>

int main() {
    int i = 1;
    
    while (i <= 5) {
        printf("i = %d\n", i);
        i++;
    }
    
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1
i = 2
i = 3
i = 4
i = 5
循环结束

2.4 注意事项

  • 无限循环:如果条件永远为真,会导致无限循环,应确保循环体内有使条件变为假的语句
  • 空循环体:如果循环体为空,可以使用分号;作为循环体

3. do-while循环

do-while循环是一种先执行循环体,后检查条件的循环语句,确保循环体至少执行一次。

3.1 语法

c
do {
    // 循环体:至少执行一次的代码
} while (条件);

3.2 执行流程

  1. 执行循环体
  2. 检查条件是否为真
  3. 如果条件为真,回到步骤1,再次执行循环体
  4. 如果条件为假,退出循环

3.3 示例

c
#include <stdio.h>

int main() {
    int i = 1;
    
    do {
        printf("i = %d\n", i);
        i++;
    } while (i <= 5);
    
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1
i = 2
i = 3
i = 4
i = 5
循环结束

3.4 while vs do-while

  • while循环:先检查条件,再执行循环体,可能一次也不执行
  • do-while循环:先执行循环体,再检查条件,至少执行一次

3.5 示例:do-while的应用场景

c
#include <stdio.h>

int main() {
    int choice;
    
    do {
        printf("\n菜单:\n");
        printf("1. 选项1\n");
        printf("2. 选项2\n");
        printf("3. 退出\n");
        printf("请选择:");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("你选择了选项1\n");
                break;
            case 2:
                printf("你选择了选项2\n");
                break;
            case 3:
                printf("退出程序\n");
                break;
            default:
                printf("无效的选择\n");
                break;
        }
    } while (choice != 3);
    
    return 0;
}

在这个例子中,我们使用do-while循环实现了一个菜单系统,确保菜单至少显示一次。

4. for循环

for循环是C语言中最常用的循环语句,它将初始化、条件检查和迭代语句组合在一起,使循环结构更加清晰。

4.1 语法

c
for (初始化; 条件; 迭代) {
    // 循环体:条件为真时执行的代码
}

4.2 说明

  • 初始化:在循环开始前执行一次,通常用于初始化循环变量
  • 条件:每次循环开始前检查,为真时执行循环体
  • 迭代:每次循环结束后执行,通常用于更新循环变量

4.3 执行流程

  1. 执行初始化语句
  2. 检查条件是否为真
  3. 如果条件为真,执行循环体
  4. 执行迭代语句
  5. 回到步骤2,再次检查条件
  6. 如果条件为假,退出循环

4.4 示例

c
#include <stdio.h>

int main() {
    int i;
    
    for (i = 1; i <= 5; i++) {
        printf("i = %d\n", i);
    }
    
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1
i = 2
i = 3
i = 4
i = 5
循环结束

4.5 灵活的for循环

for循环的三个部分都可以省略,但分号必须保留:

4.5.1 省略初始化

c
#include <stdio.h>

int main() {
    int i = 1;
    
    for (; i <= 5; i++) {
        printf("i = %d\n", i);
    }
    
    return 0;
}

4.5.2 省略条件

c
#include <stdio.h>

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

4.5.3 省略迭代

c
#include <stdio.h>

int main() {
    int i;
    
    for (i = 1; i <= 5;) {
        printf("i = %d\n", i);
        i++;
    }
    
    return 0;
}

4.5.4 省略所有部分(无限循环)

c
#include <stdio.h>

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

5. 循环控制语句

C语言提供了三种循环控制语句,用于改变循环的执行流程

  1. break:跳出当前循环
  2. continue:跳过本次循环,进入下一次循环
  3. goto:跳转到指定的标签位置

5.1 break语句

break语句用于立即跳出当前循环,执行循环后面的代码。

5.1.1 示例

c
#include <stdio.h>

int main() {
    int i;
    
    for (i = 1; i <= 10; i++) {
        if (i == 6) {
            break;  // 当i等于6时跳出循环
        }
        printf("i = %d\n", i);
    }
    
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1
i = 2
i = 3
i = 4
i = 5
循环结束

5.2 continue语句

continue语句用于跳过本次循环的剩余部分,直接进入下一次循环的条件检查。

5.2.1 示例

c
#include <stdio.h>

int main() {
    int i;
    
    for (i = 1; i <= 5; i++) {
        if (i == 3) {
            continue;  // 当i等于3时跳过本次循环
        }
        printf("i = %d\n", i);
    }
    
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1
i = 2
i = 4
i = 5
循环结束

5.3 goto语句

goto语句用于无条件跳转到指定的标签位置,可以用于跳出多层循环。

5.3.1 语法

c
goto 标签;
...
标签:
    // 跳转到这里

5.3.2 示例

c
#include <stdio.h>

int main() {
    int i, j;
    
    for (i = 1; i <= 3; i++) {
        for (j = 1; j <= 3; j++) {
            printf("i = %d, j = %d\n", i, j);
            if (i == 2 && j == 2) {
                goto end_loop;  // 跳转到标签end_loop
            }
        }
    }
    
end_loop:
    printf("循环结束\n");
    return 0;
}

输出结果:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
循环结束

5.3.3 注意事项

goto语句可能会使代码结构混乱,应尽量避免使用,特别是在大型程序中。

6. 嵌套循环

嵌套循环是指在一个循环的循环体中包含另一个循环,用于处理更复杂的问题。

6.1 示例:打印乘法表

c
#include <stdio.h>

int main() {
    int i, j;
    
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= i; j++) {
            printf("%d × %d = %d\t", j, i, i * j);
        }
        printf("\n");
    }
    
    return 0;
}

输出结果:

1 × 1 = 1	
1 × 2 = 2	2 × 2 = 4	
1 × 3 = 3	2 × 3 = 6	3 × 3 = 9	
1 × 4 = 4	2 × 4 = 8	3 × 4 = 12	4 × 4 = 16	
1 × 5 = 5	2 × 5 = 10	3 × 5 = 15	4 × 5 = 20	5 × 5 = 25	
1 × 6 = 6	2 × 6 = 12	3 × 6 = 18	4 × 6 = 24	5 × 6 = 30	6 × 6 = 36	
1 × 7 = 7	2 × 7 = 14	3 × 7 = 21	4 × 7 = 28	5 × 7 = 35	6 × 7 = 42	7 × 7 = 49	
1 × 8 = 8	2 × 8 = 16	3 × 8 = 24	4 × 8 = 32	5 × 8 = 40	6 × 8 = 48	7 × 8 = 56	8 × 8 = 64	
1 × 9 = 9	2 × 9 = 18	3 × 9 = 27	4 × 9 = 36	5 × 9 = 45	6 × 9 = 54	7 × 9 = 63	8 × 9 = 72	9 × 9 = 81

7. 循环的选择

在不同的场景中,应选择合适的循环语句:

7.1 while循环

  • 适用场景:当循环次数不确定,只知道循环条件时
  • 优点:结构简单,易于理解
  • 示例:等待用户输入正确的值

7.2 do-while循环

  • 适用场景:当循环体至少需要执行一次时
  • 优点:确保循环体至少执行一次
  • 示例:实现菜单系统

7.3 for循环

  • 适用场景:当循环次数确定时
  • 优点:结构清晰,将初始化、条件和迭代放在一起
  • 示例:遍历数组,计算1到n的和

8. 示例:综合运用

让我们看一个综合运用各种循环语句的例子:

c
#include <stdio.h>

int main() {
    int choice, num, i, sum;
    
    do {
        printf("\n菜单:\n");
        printf("1. 计算1到n的和\n");
        printf("2. 打印n个星号\n");
        printf("3. 打印倒三角\n");
        printf("4. 退出\n");
        printf("请选择:");
        scanf("%d", &choice);
        
        switch (choice) {
            case 1:
                printf("请输入n的值:");
                scanf("%d", &num);
                sum = 0;
                for (i = 1; i <= num; i++) {
                    sum += i;
                }
                printf("1到%d的和是:%d\n", num, sum);
                break;
                
            case 2:
                printf("请输入星号的个数:");
                scanf("%d", &num);
                i = 0;
                while (i < num) {
                    printf("*");
                    i++;
                }
                printf("\n");
                break;
                
            case 3:
                printf("请输入行数:");
                scanf("%d", &num);
                for (i = num; i >= 1; i--) {
                    int j = 0;
                    while (j < i) {
                        printf("*");
                        j++;
                    }
                    printf("\n");
                }
                break;
                
            case 4:
                printf("退出程序\n");
                break;
                
            default:
                printf("无效的选择\n");
                break;
        }
    } while (choice != 4);
    
    return 0;
}

9. 注意事项

  1. 无限循环:确保循环有终止条件,避免无限循环
  2. 循环变量的更新:确保循环体内有更新循环变量的语句
  3. 循环的效率:对于大型循环,应注意优化循环体,减少不必要的计算
  4. 嵌套层级:避免过多的循环嵌套,以免代码难以理解
  5. 边界条件:注意循环的边界条件,避免越界访问

10. 示例:计算斐波那契数列

让我们看一个使用循环计算斐波那契数列的例子:

c
#include <stdio.h>

int main() {
    int n, i, a = 0, b = 1, next;
    
    printf("请输入斐波那契数列的项数:");
    scanf("%d", &n);
    
    printf("斐波那契数列的前%d项:\n", n);
    
    for (i = 1; i <= n; i++) {
        if (i == 1) {
            printf("%d ", a);
            continue;
        }
        if (i == 2) {
            printf("%d ", b);
            continue;
        }
        next = a + b;
        a = b;
        b = next;
        printf("%d ", next);
    }
    
    printf("\n");
    return 0;
}

小结

C语言提供了三种主要的循环语句:

  1. while循环:先检查条件,再执行循环体
  2. do-while循环:先执行循环体,再检查条件,确保至少执行一次
  3. for循环:将初始化、条件检查和迭代语句组合在一起,结构清晰

此外,C语言还提供了循环控制语句:

  • break:跳出当前循环
  • continue:跳过本次循环的剩余部分
  • goto:无条件跳转到指定标签(应尽量避免使用)

选择合适的循环语句可以使代码更加简洁、高效。在实际编程中,应根据具体场景选择合适的循环语句,并注意避免无限循环和其他常见错误。