前言:程序如何做出选择与重复执行?
在日常生活中,我们每天都在做决定和重复动作:
- 分支场景:如果天气下雨,就带上雨伞;否则空手出门。
- 循环场景:每日三餐、工作、休息,周而复始。
编程中的逻辑也遵循同样的规律。通过分支结构,程序可以根据不同条件执行不同的代码路径;借助循环机制,可以反复运行某段代码,避免冗余书写。这两种控制流程的语句构成了几乎所有程序的核心骨架。
一、分支语句:让程序具备判断能力
分支语句允许程序依据特定条件选择执行哪一部分代码。
1. if 语句 —— 最基础的选择结构
当某个条件成立时,执行相应操作。
if (条件) {
// 条件为真时执行的代码
}
例如:只有温度高于30度才开启空调。
#include <stdio.h>
int main() {
int money = 100;
if (money >= 50) {
printf("我可以买这本书!\n");
}
return 0;
}
2. if-else 语句 —— 二选一决策
提供两种互斥的执行路径:条件成立走一条,不成立走另一条。
if (条件) {
// 条件为真时执行
} else {
// 条件为假时执行
}
实际应用场景如用户登录验证:密码正确进入系统,错误则提示重试。
#include <stdio.h>
int main() {
int score = 85;
if (score >= 60) {
printf("恭喜,考试及格!\n");
} else {
printf("很遗憾,需要继续努力\n");
}
return 0;
}
3. if-else if-else 结构 —— 多种情况判断
适用于多个条件依次判断的情形。
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件2为真时执行
} else if (条件3) {
// 条件3为真时执行
} else {
// 所有条件都为假时执行
}
比如根据考试成绩划分等级:
- 90分以上为A
- 80~89为B
- 依此类推...
#include <stdio.h>
int main() {
int score;
printf("请输入成绩:");
scanf("%d", &score);
if (score >= 90) {
printf("优秀!\n");
} else if (score >= 80) {
printf("良好\n");
} else if (score >= 70) {
printf("中等\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
return 0;
}
4. switch 语句 —— 多路跳转的高效方式
特别适合对单一变量进行多种值匹配的情况。
switch (表达式) {
case 值1:
// 代码块1
break;
case 值2:
// 代码块2
break;
default:
// 默认代码块
}
以输入数字判断星期为例,简洁明了地实现七种输出。
#include <stdio.h>
int main() {
int day;
printf("请输入星期(1-7):");
scanf("%d", &day);
switch (day) {
case 1:
printf("星期一:新的开始!\n");
break;
case 2:
case 3:
case 4:
case 5:
printf("工作日,加油!\n");
break;
case 6:
case 7:
printf("周末,好好休息!\n");
break;
default:
printf("输入错误!\n");
}
return 0;
}
注意事项:
- 每个 case 后建议使用 break,防止“穿透”到下一个分支。
- case 标签后只能是整型或字符型常量,不能是表达式或变量。
二、循环语句:实现重复执行的关键工具
当需要多次运行相同或相似代码块时,循环语句极大提升了效率。
1. for 循环 —— 适用于已知次数的循环
常用于计数循环,结构清晰,初始化、条件、迭代一步到位。
for (初始化; 循环条件; 更新) {
// 循环体
}
示例:打印从1到10的所有整数。
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 10; i++) {
printf("%d ", i);
}
printf("\n");
return 0;
}
其执行流程包括初始化 → 判断条件 → 执行循环体 → 更新变量 → 再次判断。
text
1. i=1 → 1<=10成立 → 输出1 → i++变成2
2. i=2 → 2<=10成立 → 输出2 → i++变成3
...
10. i=10 → 10<=10成立 → 输出10 → i++变成11
11. i=11 → 11<=10不成立 → 循环结束
实用功能扩展:计算1加到100的总和。
#include <stdio.h>
int main() {
int sum = 0;
int i;
for (i = 1; i <= 100; i++) {
sum += i; // 相当于 sum = sum + i
}
printf("1到100的和是:%d\n", sum);
return 0;
}
2. while 循环 —— 条件驱动型循环
只要指定条件为真,就持续执行循环体。
while (条件) {
// 循环体
}
典型应用:模拟密码输入过程,直到输入正确为止。
#include <stdio.h>
int main() {
int password = 123456;
int input;
int attempts = 0;
printf("请输入密码:");
scanf("%d", &input);
while (input != password && attempts < 2) {
attempts++;
printf("密码错误,还有%d次机会:", 3 - attempts);
scanf("%d", &input);
}
if (input == password) {
printf("登录成功!\n");
} else {
printf("登录失败!\n");
}
return 0;
}
3. do-while 循环 —— 至少执行一次的循环
先执行循环内容,再判断是否继续,确保至少运行一遍。
do {
// 循环体
} while (条件);
常见于菜单系统设计中,比如主界面选项选择。
#include <stdio.h>
int main() {
int choice;
do {
printf("\n=== 菜单 ===\n");
printf("1. 开始游戏\n");
printf("2. 设置\n");
printf("3. 退出\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("游戏开始!\n");
break;
case 2:
printf("进入设置\n");
break;
case 3:
printf("再见!\n");
break;
default:
printf("无效选择!\n");
}
} while (choice != 3); // 只要不是退出选项,就继续显示菜单
return 0;
}
三、循环控制语句:精准调控循环行为
在复杂逻辑中,仅靠基本循环不够灵活,需配合控制关键字。
1. break —— 立即终止当前循环
一旦触发,跳出整个循环结构,不再进行后续迭代。
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当i等于5时立即退出循环
}
printf("%d ", i);
}
// 输出:1 2 3 4
return 0;
}
2. continue —— 跳过本次剩余步骤
结束当前轮次,直接进入下一轮判断。
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 如果是偶数,跳过本次循环
}
printf("%d ", i);
}
// 输出:1 3 5 7 9(只输出奇数)
return 0;
}
四、综合实战演练
结合所学知识解决真实问题。
案例1:判断一个数是否为素数
利用循环配合条件判断,检测是否存在除1和自身外的因子。
#include <stdio.h>
#include <math.h>
int main() {
int num, i;
int is_prime = 1; // 1表示是素数,0表示不是
printf("请输入一个正整数:");
scanf("%d", &num);
// 处理特殊情况
if (num <= 1) {
is_prime = 0;
} else {
// 检查从2到sqrt(num)是否有因子
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
is_prime = 0;
break;
}
}
}
if (is_prime) {
printf("%d 是素数\n", num);
} else {
printf("%d 不是素数\n", num);
}
return 0;
}
案例2:输出九九乘法表
嵌套循环的经典应用,展示双重 for 的强大表现力。
#include <stdio.h>
int main() {
int i, j;
printf("九九乘法表:\n");
for (i = 1; i <= 9; i++) { // 外层循环控制行
for (j = 1; j <= i; j++) { // 内层循环控制列
printf("%d×%d=%-2d ", j, i, i * j);
}
printf("\n");
}
return 0;
}
五、使用建议:如何选择合适的结构?
合理选用语句类型能提升代码可读性和效率。
分支结构选择参考:
- if-else:适用于条件数量较少(2~3个),或逻辑较复杂的判断。
- switch:当有四个及以上固定值比较时更高效,尤其适合枚举类场景。
循环结构选择参考:
- for:循环次数明确,如遍历数组、计数任务。
- while:依赖动态条件决定是否继续,适合不确定循环次数的场景。
- do-while:要求至少执行一次的操作,如交互式菜单系统。
六、常见错误与调试策略
初学者容易踩坑的地方及应对方法。
常见错误清单:
- 在 switch 中遗漏 break 导致多个 case 被连续执行。
- 编写出无限循环,通常是循环条件始终为真。
- 误将赋值运算符 = 写成相等比较 ==,如 if (a = 5) 应为 if (a == 5)。
- 忘记更新循环变量,造成无法退出循环。
掌握这些陷阱有助于快速定位问题。
// 添加调试输出
for (i = 0; i < 10; i++) {
printf("调试:i=%d\n", i); // 查看循环执行情况
// 你的代码
}
总结
分支与循环是C语言中最核心的流程控制手段,理解并熟练运用它们意味着掌握了编程的基本思维方式。
- 分支赋予程序智能,使其能够根据不同数据做出响应。
- 循环赋予程序耐力,自动完成重复性高但规则明确的任务。
- 控制语句(break、continue)增强了程序的灵活性与精确度。
唯有通过不断练习、深入思考与反复调试,才能真正驾驭这些关键结构。
实践建议
尝试用今天学习的内容编写一个简易计算器程序,支持加减乘除四种运算,并允许用户连续计算,直到主动选择退出程序为止。


雷达卡


京公网安备 11010802022788号







