C 语言流程控制详解:顺序、分支与循环全解析
顺序结构是 C 语言程序最基本的执行模式,程序从main函数开始,按照代码书写顺序依次执行,直到遇到return 0main函数结束标志)。这种结构无需额外关键字控制,代码自上而下自然执行,是所有复杂逻辑的基础。例如:c运行上述代码会依次完成变量定义、求和、打印操作,无跳转或分支,属于典型的顺序结构。
一、顺序结构:程序执行的基础
顺序结构是 C 语言程序最基本的执行模式,程序从main函数开始,按照代码书写顺序依次执行,直到遇到return 0(main函数结束标志)。
这种结构无需额外关键字控制,代码自上而下自然执行,是所有复杂逻辑的基础。例如:
c
运行
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int sum = a + b;
printf("sum = %d\n", sum); // 按顺序执行赋值、计算、打印
return 0;
}
上述代码会依次完成变量定义、求和、打印操作,无跳转或分支,属于典型的顺序结构。
二、分支结构:根据条件选择执行路径
分支结构允许程序根据特定条件判断,选择不同的代码块执行。要使用分支结构,需先掌握关系运算符、逻辑运算符,再结合if、switch关键字实现。
2.1 核心基础:关系运算符与逻辑运算符
关系运算符(双目运算符)
用于比较两个值的关系,结果为逻辑值(真 / 假),在 C 语言中用整数表示:0 代表假(false),非 0 代表真(true)。
- 常用关系运算符:
>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于) - 注意:
==是判断相等的关系运算符,与赋值运算符=完全不同,误用会导致逻辑错误。
逻辑运算符
用于组合多个关系表达式,实现更复杂的条件判断:
&&(逻辑与):左右表达式同时为真,整体才为真(“既要又要”)||(逻辑或):左右表达式至少一个为真,整体就为真(“要么要么”)!(逻辑非,单目运算符):取反逻辑值,真变假、假变真
逻辑运算真值表
| 左表达式 | 右表达式 | && 结果 | || 结果 ||----------|----------|-----------|-----------|| 真(非 0) | 真(非 0) | 真(1) | 真(1) || 真(非 0) | 假(0) | 假(0) | 真(1) || 假(0) | 真(非 0) | 假(0) | 真(1) || 假(0) | 假(0) | 假(0) | 假(0) |
关键特性:短路截断
逻辑运算符存在 “短路” 现象,可优化程序执行效率:
&&:左表达式为假时,直接判定整体为假,右表达式不再执行||:左表达式为真时,直接判定整体为真,右表达式不再执行
示例:
c
运行
int a = 0, b = 0;
a++ && b++; // 左表达式a++后为0(假),b++不执行,最终a=1,b=0
++a || b++; // 左表达式++a后为1(真),b++不执行,最终a=1,b=0
2.2 输入数据:分支判断的前提
分支结构常依赖用户输入的数据作为判断条件,scanf是 C 语言常用输入函数,推荐以下使用方式:
不推荐方式(易出错)
- 格式化字符串中包含非控制字符(如
scanf("plsnum %d", &num)),需严格匹配输入格式(如必须输入 “plsnum 123”),否则接收失败。 - 无接收变量的输入(如
scanf("hello")),仅读取内容不存储,实际用途极少。
推荐方式(通用稳定)
格式化字符串中仅保留控制字符(%d整型、%s字符串、%c字符),输入时直接传入对应数据即可:
c
运行
#include <stdio.h>
int main() {
int num1 = 0, num2 = 0;
printf("请输入两个整数:");
scanf("%d %d", &num1, &num2); // 直接输入“10 20”即可,空格分隔
printf("你输入的数是:%d 和 %d\n", num1, num2);
return 0;
}
2.3 三目运算符:简化分支判断
三目运算符(? :)是分支结构的简化形式,用于二选一的简单判断,语法如下:
c
运行
表达式1 ? 表达式2 : 表达式3;
- 逻辑:若表达式 1 为真,整体结果为表达式 2 的值;否则为表达式 3 的值。
- 示例:求两个数的最大值
c
运行
int a = 15, b = 25;
int max = (a > b) ? a : b; // a>b为假,max = 25
2.4 if 分支:灵活的条件判断
if分支适用于各种条件判断,支持单分支、双分支、多分支和嵌套结构,灵活性极高。
1. 简单 if(单分支)
c
运行
if (表达式) {
// 表达式为真时执行的代码块
}
- 注意:
if后面不要加多余分号,否则会导致代码块与if脱离(编译器不报错,但逻辑错误)。
2. if-else(双分支)
c
运行
if (表达式) {
// 表达式为真时执行
} else {
// 表达式为假时执行
}
示例:判断奇偶数
c
运行
int num = 0;
scanf("%d", &num);
if (num % 2 == 0) {
printf("%d 是偶数\n", num);
} else {
printf("%d 是奇数\n", num);
}
3. 阶梯 if(多分支)
适用于多个互斥条件的判断,语法如下:
c
运行
if (表达式1) {
语句1;
} else if (表达式2) {
语句2;
} else if (表达式3) {
语句3;
} else {
// 所有条件都不满足时执行
语句4;
}
示例:成绩等级判断
c
运行
int score = 0;
scanf("%d", &score);
if (score >= 90) {
printf("优秀\n");
} else if (score >= 80) {
printf("良好\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
4. 嵌套 if(多层条件)
在if或else代码块中嵌套另一个if结构,用于复杂的多层判断:
c
运行
if (表达式1) {
if (表达式2) {
语句1; // 表达式1和2都为真
} else {
语句2; // 表达式1真、2假
}
} else {
语句3; // 表达式1假
}
- 注意:嵌套层数建议控制在 5 层以下,否则代码可读性极差。
2.5 switch 分支:多常量匹配
switch适用于多个常量值匹配的场景(如菜单选择、状态判断),当分支数大于 3 时,比阶梯if更简洁。
语法结构
c
运行
switch (整型表达式) {
case 常量1:
语句1;
break; // 跳出switch,避免穿透
case 常量2:
语句2;
break;
case 常量3:
语句3;
break;
default:
// 所有case都不匹配时执行
语句4;
}
- 关键:
case后必须是常量(不能是变量),且每个case执行完后需加break,否则会发生 “穿透”(继续执行下一个case的语句)。 - 示例:菜单选择
c
运行
int choice = 0;
printf("1. 登录 2. 注册 3. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("执行登录逻辑\n");
break;
case 2:
printf("执行注册逻辑\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("输入错误\n");
}
三、循环结构:重复执行代码块
循环结构用于让一段代码重复执行,C 语言中主要通过for、while、do-while实现,核心是 “循环条件” 和 “循环体” 的设计。
3.1 while 循环:先判断后执行
语法:
c
运行
while (循环条件) {
循环体; // 条件为真时重复执行
}
- 逻辑:先判断循环条件,若为真则执行循环体,执行完后再次判断条件,直到条件为假退出循环。
- 注意:循环体中必须有改变循环条件的语句,否则会导致无限循环。
- 示例:计算 1~100 的和
c
运行
int i = 1, sum = 0;
while (i <= 100) {
sum += i;
i++; // 改变循环条件,避免无限循环
}
printf("1~100的和:%d\n", sum);
3.2 do-while 循环:先执行后判断
语法:
c
运行
do {
循环体; // 先执行一次
} while (循环条件); // 再判断条件,真则继续循环
- 特点:循环体至少执行一次,适用于 “必须先执行一次” 的场景(如密码输入验证)。
- 示例:密码验证
c
运行
int password = 0;
do {
printf("请输入密码:");
scanf("%d", &password);
} while (password != 123456); // 密码错误则重新输入
printf("密码正确,登录成功\n");
3.3 for 循环:结构化更强
语法:
c
运行
for (初始化表达式; 循环条件; 更新表达式) {
循环体;
}
- 执行顺序:初始化表达式(仅执行一次)→ 判断循环条件(真则执行循环体)→ 执行更新表达式 → 再次判断条件,直到条件为假。
- 优势:初始化、条件判断、更新表达式集中在一行,结构清晰,是最常用的循环方式。
- 示例:打印 1~10 的数字
c
运行
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
3.4 循环控制:break 与 continue
break:直接跳出当前循环,不再执行后续循环体和判断。continue:跳过本次循环的剩余部分,直接进入下一次循环条件判断。
示例:
c
运行
// break示例:找到第一个能被3整除的数后退出
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) {
printf("找到:%d\n", i);
break; // 跳出循环
}
}
// continue示例:只打印奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数,直接进入下一次循环
}
printf("%d ", i); // 只打印1、3、5、7、9
}更多推荐


所有评论(0)