C 语言程序并不只是“从上往下执行”这么简单。写到判断、重复处理或多分支选择时,真正决定程序行为的是流程控制结构。本文按“先看执行顺序,再看分支判断,最后看循环重复”的路径,把入门阶段最容易混淆的语法和规则拆开说明,并用示例帮助你判断什么时候该用 if、switch、for、while 或 do-while。
顺序结构:程序默认是怎样执行的
C 语言是一门结构化程序设计语言,常见的程序结构可以分为顺序结构、选择结构和循环结构。其中,顺序结构是最基础的一种:语句按照书写顺序依次执行,中间没有跳转、分支或循环介入。
在 C 语言中,每条语句通常以分号 ; 结束,多个语句也可以放进同一个代码块,并用一对大括号 {} 包起来。只要没有流程控制语句,程序就会从上到下逐条执行。
#include
int main() {
int a, b, sum;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
sum = a + b;
printf("它们的和为:%d", sum);
return 0;
}
这个程序的执行顺序是固定的:先提示输入,再读取两个整数,接着计算 sum = a + b;,最后输出结果。它没有任何条件判断,也不会重复执行某段代码,因此就是典型的顺序结构。
分支结构:什么时候该让程序走不同路径
当程序需要“根据条件决定做什么”时,就要用到分支结构。C 语言里最常见的两类分支语句是 if 和 switch。前者适合做条件判断,后者适合对单个表达式的多个固定取值进行分派。
if:条件成立才执行
if 语句用于在条件满足时执行指定代码块,基本语法如下:
if (表达式) {
// 如果条件为真,执行这里的代码块
}
如果 if 后面只有一条语句,大括号可以省略,但入门阶段更建议保留,便于阅读和维护。还要注意一个基础规则:在 C 语言里,0 表示假,非 0 表示真。也就是说,表达式结果为 0 时不执行,为非 0 时执行。
#include
int main(){
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num > 0) {
printf("这是一个正数。n");
}
return 0;
}
这个例子里,只有在 num > 0 成立时,程序才会输出“这是一个正数”。如果输入 0 或负数,if 语句中的代码块就不会执行。
if...else:两种结果二选一
如果条件成立和不成立时都要给出处理逻辑,可以使用 if...else:
if (表达式) {
// 如果条件为真,执行这里的代码块
} else {
// 如果条件为假,执行这里的代码块
}
它表示程序一定会在两个分支里选择一个执行,适合“满足条件”和“不满足条件”两种结果都需要明确处理的场景。
#include
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num > 0) {
printf("这是一个正数。n");
} else {
printf("这是0或者负数。n");
}
return 0;
}
在这个程序中,输入正数时输出“这是一个正数”;输入 0 或负数时,则进入 else 分支,输出“这是0或者负数”。
多重判断与嵌套 if
当判断结果不止两种时,可以把 else 和新的 if 连起来,形成多重判断,也就是常见的 else if 结构。
#include
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (num > 0)
printf("这是一个正数。n");
else if (num < 0)
printf("这是一个负数。n");
else
printf("这是零。n");
return 0;
}
这样就能把一个整数分成三种情况:大于 0、小于 0、等于 0。相比只用一个 if...else,这种写法更适合处理连续的条件分支。
需要特别注意的是,分支一多,就容易出现所谓的悬空 else 问题。规则其实很简单:else 总是和离它最近、且尚未匹配的 if 结合。
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehen");
else
printf("hahan");
return 0;
}
这段代码看起来好像 else 和第一个 if 对齐,但实际匹配的是第二个 if(b == 2)。因此,只要第一个条件 a == 1 不成立,内部那组 if...else 就根本没有执行机会,最后什么都不会打印。
把缩进改得更清楚后,这种匹配关系会更容易看出来:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehen");
else
printf("hahan");
return 0;
}
如果你的真实意图是让 else 对应第一个 if,最直接的方法就是加上大括号,显式划定代码块范围:
#include
int main() {
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehen");
}
else
{
printf("hahan");
}
return 0;
}
这个例子说明了一件很实用的事:缩进只是给人看,真正决定匹配关系的是语法结构。初学时尽量不要省略大括号,能少踩很多坑。
switch:对固定取值做多分支选择
如果判断对象是“同一个表达式的多个可能值”,用 switch 往往比一长串 if...else if 更清晰。它的基本语法如下:
switch (表达式) {
case value1:
// 如果表达式的值等于value1,执行这里的代码块
break;
case value2:
// 如果表达式的值等于value2,执行这里的代码块
break;
// 更多的case语句
default:
// 如果表达式的值不等于任何一个value,执行这里的代码块
}
switch 会先计算表达式的值,再和各个 case 后面的常量逐一比较。匹配成功就从对应位置开始执行;如果都不匹配,则执行 default,而 default 是可选的。
#include
int main() {
int num;
printf("请输入一个数字:");
scanf("%d", &num);
switch (num) {
case 1:
printf("这是数字1。n");
break;
case 2:
printf("这是数字2。n");
break;
case 3:
printf("这是数字3。n");
break;
default:
printf("这是其他数字。n");
}
return 0;
}
这个例子中,程序会根据 num 的值输出不同结果。如果是 1、2、3,就进入对应的 case;否则执行 default。
这里最容易漏掉的是 break。如果某个 case 末尾没有写 break,程序在执行完当前分支后还会继续往下执行后面的 case,这就是常说的“贯穿”或“穿透”行为。除非你明确需要这种效果,否则通常都应该在每个 case 后加上 break。
另外,switch 的表达式通常支持整数类型、字符类型和枚举类型,但不支持浮点数类型和字符串类型。还有一个细节:case 和后边的数字之间必须有空格。
循环结构:重复执行一段代码时怎么选
当程序需要把同一组操作执行多次时,就应该使用循环结构。C 语言里最常见的三种循环分别是 for、while 和 do-while。它们都能实现重复执行,但控制方式和适用场景并不完全一样。

for 循环:次数明确时最常用
for 循环是最常见的循环结构之一,尤其适合“已知大概要循环多少次”的情况。语法如下:
for (初始化表达式; 循环条件; 更新表达式) {
// 循环体语句
}
这三部分各有明确分工:
- 初始化表达式:在循环开始前执行,一般用于变量初始化。
- 循环条件:每次循环前先判断,条件为真时继续,条件为假时结束。
- 更新表达式:每轮循环结束后执行,通常用于更新循环变量。
#include
int main() {
int i = 0;
for (i = 0; i < 5; i++) {
printf("i = %dn", i);
}
return 0;
}
执行顺序可以理解为:先执行表达式 1 初始化变量;然后检查表达式 2;如果结果为 0,循环结束;如果结果不为 0,就执行循环体;循环体执行完后,再执行表达式 3 更新变量,之后回到表达式 2 继续判断。
其中,初始化部分只执行 1 次,后续反复参与循环的是“条件判断、循环体、更新表达式”这三步。这也是 for 看起来紧凑、适合计数循环的原因。
while 循环:先判断,再决定是否进入
while 循环也是基础而常用的一种形式,它更强调“只要条件成立,就一直执行”。基本语法如下:
while (表达式)
语句; // 如果循环体想包含更多的语句,可以加上括号
它的执行逻辑是先判断表达式,如果值为真(非 0),就执行循环体;如果值为假(0),则直接结束循环。因此,while 有一个非常重要的特点:条件一开始不成立时,循环体一次都不会执行。
while 的流程可以概括为:
- 先计算表达式的值;
- 如果结果为假(0),结束循环;
- 如果结果为真(非 0),执行循环体;
- 回到条件判断,重复上述过程。
在实际使用中,通常会借助循环计数器或状态变量来控制退出时机,也可以在循环体内部配合 break 和 continue 调整执行流程。
#include
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
return 0;
}
这个例子中,变量 i 从 1 开始,只要满足 i <= 10,就输出当前值并执行 i++。一旦 i 增长到 11,条件不再成立,循环结束。
do-while 循环:先执行一次,再检查条件
有些场景下,循环体至少要先跑一次,之后再决定是否继续。这时就该用 do-while。它的语法如下:
do {
// 循环体
} while (循环条件);
do 表示先执行循环体,while 再负责检查是否继续循环。和普通 while 最大的区别在于:do-while 能保证循环体至少执行一次,即便条件从一开始就是假的,也会先执行首轮。
#include
int main() {
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i <= 10);
printf("1+2+...+10=%dn", sum);
return 0;
}
这段代码使用 sum 记录累加结果,使用 i 记录当前加到哪个数。每次先把 i 加入 sum,再让 i 自增,最后检查是否仍满足 i <= 10。因此它可以完成 1 到 10 的累加,并输出结果。
怎么理解三种循环和两类分支的使用场景
把这些语法放到一起看,思路会更清晰:
- 只是按顺序执行,就用顺序结构。
- 只在条件成立时做事,用
if。 - 条件成立和不成立都要分别处理,用
if...else。 - 同一个表达式需要对应多个固定值分支时,用
switch。 - 循环次数较明确,适合用
for。 - 是否继续主要取决于某个条件,适合用
while。 - 循环体必须先执行一次,再判断是否继续,用
do-while。
对初学者来说,流程控制最关键的不是死记语法,而是先判断程序到底需要“顺着执行”“分开处理”还是“重复处理”。只要先把这个问题想明白,再去选 if、switch 或三种循环,代码结构就会自然很多。







