C 语言流程控制全指南:选择、循环与跳转语句实战详解

56 阅读9分钟

C 语言流程控制全指南:选择、循环与跳转语句实战详解

流程控制是 C 语言编程的核心逻辑,决定了程序的执行顺序 —— 从简单的顺序执行,到根据条件分支的选择结构,再到重复执行的循环结构,配合跳转语句可灵活实现复杂功能。本文系统拆解 C 语言选择结构(if/switch)、循环结构(for/while/do-while)及跳转结构(break/continue/goto)的语法规则、实战案例与使用场景,附带避坑指南,助力快速掌握流程控制的核心用法。

一、程序的三种基本结构

C 语言程序的执行逻辑基于三种基础结构,所有复杂程序均由其组合而成:

  1. 顺序结构:默认执行方式,语句按书写顺序自上向下依次执行(如变量定义→输入→运算→输出);
  2. 选择结构:根据条件判断执行不同代码块(核心语句:if 系列、switch);
  3. 循环结构:重复执行某段代码直到满足终止条件(核心语句:for、while、do-while);
  4. 跳转结构:改变程序默认执行顺序(核心语句:break、continue、goto、return)。

二、选择结构:根据条件分支执行

选择结构用于 “判断场景”,按条件是否成立执行不同逻辑,分为 if 系列和 switch 两种核心形式。

1. if 系列语句:区间 / 多条件判断

if 系列语句适合区间判断(如成绩等级、数值范围),分为三种基本形式,支持嵌套使用。

(1)基本 if 语句:单条件单分支
  • 语法if(条件表达式) { 代码块; }(条件为真时执行代码块,否则跳过);

  • 核心规则:条件表达式非 0 为 “真”,0 为 “假”;代码块仅 1 句时可省略{},但不建议(降低可读性);

  • 案例:判断成绩大于 90 分给予奖励:

    #include <stdio.h>
    int main() {
        int score = 0;
        printf("请输入学生成绩:");
        scanf("%d", &score);
        if (score > 90) { // 条件:成绩>90
            printf("奖励!\n"); // 条件为真时执行
        }
        return 0;
    }
    
(2)if-else 语句:单条件双分支
  • 语法if(条件表达式) { 代码块1; } else { 代码块2; }(条件为真执行代码块 1,否则执行代码块 2);

  • 案例:成绩大于 90 分奖励,否则惩罚:

    if (score > 90) {
        printf("奖励!\n");
    } else {
        printf("惩罚!\n");
    }
    
(3)if-else if-else 语句:多条件多分支
  • 语法if(条件1) { 代码块1; } else if(条件2) { 代码块2; } ... else { 代码块n; }

  • 核心规则:条件按顺序判断,满足一个即执行对应代码块,后续条件不再判断;else 为兜底分支(所有条件不满足时执行);

  • 案例:成绩等级评定(90 + 优秀、80-90 良好、60-80 中等、<60 差):

    if (score >= 90 && score <= 100) {
        printf("优秀!\n");
    } else if (score >= 80) {
        printf("良好!\n");
    } else if (score >= 60) {
        printf("中等!\n");
    } else if (score >= 0) {
        printf("差!\n");
    } else {
        printf("成绩输入无效!\n"); // 兜底处理非法输入
    }
    
(4)if 语句嵌套:复杂条件判断
  • 规则:if 语句内部可嵌套另一个 if/else 语句,else 默认与 “最近的未配对 if” 结合(建议用{}明确配对关系);

  • 案例:判断 x 的符号(x>0 输出 1、x=0 输出 0、x<0 输出 - 1):

    int x = 0, y = 0;
    scanf("%d", &x);
    if (x != 0) {
        if (x > 0) {
            y = 1;
        } else {
            y = -1;
        }
    } else {
        y = 0;
    }
    printf("y=%d\n", y);
    

2. switch 语句:等值判断(菜单 / 枚举场景)

switch 语句适合 “固定值匹配”(如星期、菜单选项、等级枚举),执行效率高于多分支 if-else。

(1)核心语法
switch(变量) { // 变量仅支持int、char类型
    case 常量1: 代码块1; break; // 匹配成功执行代码块,break跳出switch
    case 常量2: 代码块2; break;
    ...
    default: 代码块n; break; // 所有case不匹配时执行(可省略)
}
(2)关键规则
  • case 后必须是常量表达式(如 1、'A'),且值不可重复;
  • break 语句可选:省略后会触发 “穿透效应”,继续执行下一个 case 代码(可利用该特性实现多 case 共用逻辑);
  • default 位置不限,优先匹配 case,最后匹配 default;
  • case 代码块第一句不能定义变量(语法硬性限制)。
(3)案例:根据输入数字输出星期
#include <stdio.h>
int main() {
    int n = 0;
    printf("请输入1-7的数字:");
    scanf("%d", &n);
    switch(n) {
        case 1: printf("星期一\n"); break;
        case 2: printf("星期二\n"); break;
        case 3: printf("星期三\n"); break;
        case 4: printf("星期四\n"); break;
        case 5: printf("星期五\n"); break;
        case 6: printf("星期六\n"); break;
        case 7: printf("星期日\n"); break;
        default: printf("输入错误!\n"); break;
    }
    return 0;
}
(4)穿透效应应用:多 case 共用逻辑
// 成绩等级评定(A:100、B:90-99、C:80-89、D:70-79、E:60-69、不及格:<60)
switch(score/10) {
    case 10: printf("A\n"); break;
    case 9: printf("B\n"); break;
    case 8: printf("C\n"); break;
    case 7: printf("D\n"); break;
    case 6: printf("E\n"); break;
    default: printf("不及格\n"); break;
}

3. if 与 switch 选择原则

  • 单条件 / 区间判断:用 if/if-else(如判断是否闰年、数值大小关系);
  • 多固定值匹配:用 switch(如菜单选择、等级枚举),代码更简洁高效。

三、循环结构:重复执行代码块

循环结构用于 “重复操作”(如累加求和、遍历数据),C 语言提供 for、while、do-while 三种核心语句,可互相嵌套。

1. for 语句:循环次数明确场景(最常用)

for 语句是最灵活的循环方式,适合已知循环次数或范围的场景。

(1)核心语法
for(循环变量初始化; 循环条件; 循环变量更新) {
    循环体; // 重复执行的代码
}
(2)执行流程
  1. 执行循环变量初始化(仅执行 1 次);
  2. 判断循环条件:成立则执行循环体,不成立则跳出循环;
  3. 执行循环变量更新,回到步骤 2 重复判断。
(3)案例与变形
  • 标准案例:求 1~100 累加和:

    int sum = 0;
    for (int i = 1; i <= 100; i++) { // i从1到100,每次+1
        sum += i;
    }
    printf("sum=%d\n", sum); // 输出5050
    
  • 省略变形(分号不可省略):

    • 省略初始化:int i=1; for(; i<=10; i++) { ... }
    • 省略条件:for(int i=1;; i++) { if(i>10) break; ... }(死循环,需手动终止);
    • 省略更新:for(int i=1; i<=10; ) { i++; ... }
    • 死循环:for(;;) { ... }(等价于 while (1))。

2. while 语句:循环次数未知场景

while 语句先判断条件再执行循环体,适合循环次数不确定的场景(如依赖用户输入终止)。

(1)核心语法
循环变量初始化;
while(循环条件) {
    循环体;
    循环变量更新; // 避免死循环
}
(2)案例:求 1~100 累加和(与 for 等价)
int sum = 0, i = 1;
while (i <= 100) { // 条件:i<=100
    sum += i;
    i++; // 变量更新,否则死循环
}
printf("sum=%d\n", sum);
(3)关键规则
  • 循环体若包含多个语句,必须用{}包裹;
  • 必须在循环体内更新循环变量(如 i++),否则会陷入死循环;
  • 条件为假时,循环体可能一次都不执行。

3. do-while 语句:至少执行一次的循环

do-while 语句先执行循环体,再判断条件,适合 “必须执行一次” 的场景(如密码验证)。

(1)核心语法
循环变量初始化;
do {
    循环体;
    循环变量更新;
} while(循环条件); // 分号不可省略
(2)案例:密码验证(至少输入一次密码)
#include <stdio.h>
int main() {
    int pwd = 0;
    do {
        printf("请输入密码(123456):");
        scanf("%d", &pwd);
    } while (pwd != 123456); // 密码错误则重复输入
    printf("密码正确!\n");
    return 0;
}
(3)与 while 的区别
  • while:先判断后执行,循环体可能不执行;
  • do-while:先执行后判断,循环体至少执行一次。

4. 循环嵌套:多层重复操作

循环体内可嵌套另一个完整循环(for/while/do-while 可互相嵌套),常用于多维数据处理(如矩阵、乘法表)。

案例:输出九九乘法表
#include <stdio.h>
int main() {
    for (int i = 1; i <= 9; i++) { // 外层循环:控制行数
        for (int j = 1; j <= i; j++) { // 内层循环:控制每行列数
            printf("%d×%d=%d\t", j, i, i*j);
        }
        printf("\n"); // 换行
    }
    return 0;
}

四、跳转语句:改变程序执行顺序

跳转语句用于中断循环、切换分支或无条件转移,核心包括 break、continue、goto、return 四种。

1. break 语句:终止当前结构

  • 功能:跳出最近一层的循环体(for/while/do-while)或 switch 语句;

  • 案例:输出圆面积,面积大于 100 时停止:

    #define PI 3.14159
    int r;
    for (r = 1; r <= 10; r++) {
        float area = PI * r * r;
        if (area > 100) break; // 面积>100,跳出for循环
        printf("r=%d, area=%.2f\n", r, area);
    }
    

2. continue 语句:跳过本次循环

  • 功能:结束本次循环,跳过循环体中未执行的语句,直接进入下一次循环判断;

  • 与 break 的区别:continue 仅跳过本次,break 终止整个循环;

  • 案例:输出 100~200 之间不能被 3 整除的数:

    for (int i = 100; i <= 200; i++) {
        if (i % 3 == 0) continue; // 能被3整除,跳过本次循环
        printf("%d ", i);
    }
    

3. goto 语句:无条件转移

  • 语法goto 语句标号;(标号为自定义标识符,需与目标语句对应);

  • 规则:仅能在同一个函数内跳转,标号不可重复;

  • 慎用场景:可用于跳出多层循环(比 break 更简洁),但过度使用会破坏代码结构化(不建议频繁使用);

  • 案例:用 goto 实现 1~100 累加和:

    int i = 1, sum = 0;
    loop: // 语句标号
    if (i <= 100) {
        sum += i;
        i++;
        goto loop; // 跳转到loop标号处
    }
    printf("sum=%d\n", sum);
    

4. return 语句:函数返回

  • 功能:结束当前函数执行,返回指定值(若函数有返回类型);

  • 案例:函数返回两数之和:

    int add(int a, int b) {
        return a + b; // 结束add函数,返回a+b的值
    }
    

五、常见踩坑指南

  1. if-else 配对错误:缺省{}时,else 默认与最近的 if 配对(如嵌套 if 需用{}明确范围);
  2. switch 穿透效应:忘记写 break 导致多 case 执行(需明确是否需要穿透,否则必加 break);
  3. 循环死循环:while/for 循环未更新循环变量,或条件永远为真(如while(1)需手动加 break 终止);
  4. do-while 分号遗漏:语法要求 do-while 末尾必须加;(如} while(条件););
  5. switch 变量类型错误:仅支持 int、char 类型,不可用 float、double 或字符串;
  6. 循环嵌套逻辑混乱:外层循环控制 “大维度”(如行数),内层控制 “小维度”(如列数),避免交叉嵌套。