C 语言流程控制全指南:选择、循环与跳转语句实战详解
流程控制是 C 语言编程的核心逻辑,决定了程序的执行顺序 —— 从简单的顺序执行,到根据条件分支的选择结构,再到重复执行的循环结构,配合跳转语句可灵活实现复杂功能。本文系统拆解 C 语言选择结构(if/switch)、循环结构(for/while/do-while)及跳转结构(break/continue/goto)的语法规则、实战案例与使用场景,附带避坑指南,助力快速掌握流程控制的核心用法。
一、程序的三种基本结构
C 语言程序的执行逻辑基于三种基础结构,所有复杂程序均由其组合而成:
- 顺序结构:默认执行方式,语句按书写顺序自上向下依次执行(如变量定义→输入→运算→输出);
- 选择结构:根据条件判断执行不同代码块(核心语句:if 系列、switch);
- 循环结构:重复执行某段代码直到满足终止条件(核心语句:for、while、do-while);
- 跳转结构:改变程序默认执行顺序(核心语句: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 次);
- 判断循环条件:成立则执行循环体,不成立则跳出循环;
- 执行循环变量更新,回到步骤 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的值 }
五、常见踩坑指南
- if-else 配对错误:缺省
{}时,else 默认与最近的 if 配对(如嵌套 if 需用{}明确范围); - switch 穿透效应:忘记写 break 导致多 case 执行(需明确是否需要穿透,否则必加 break);
- 循环死循环:while/for 循环未更新循环变量,或条件永远为真(如
while(1)需手动加 break 终止); - do-while 分号遗漏:语法要求 do-while 末尾必须加
;(如} while(条件);); - switch 变量类型错误:仅支持 int、char 类型,不可用 float、double 或字符串;
- 循环嵌套逻辑混乱:外层循环控制 “大维度”(如行数),内层控制 “小维度”(如列数),避免交叉嵌套。