前言
在C语言中,分支和循环是控制程序流程的核心结构。分支语句(如if-else
、switch
)允许程序根据条件选择不同的执行路径,而循环语句(如for
、while
、do-while
)则用于重复执行特定代码块。掌握这些结构是编写高效、灵活程序的基础。
一、分支结构
分支结构是程序根据条件判断选择不同执行路径的结构,C语言中主要有以下几种分支结构:
1. if语句
基本形式:
if (条件表达式) {
// 条件为真时执行的代码
}
示例:
int score = 85;
if (score >= 60) {
printf("及格\n");
}
2. if-else语句
基本形式:
if (条件表达式) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
示例:
int age = 18;
if (age >= 18) {
printf("成年人\n");
} else {
printf("未成年人\n");
}
3. else-if语句
基本形式:
if (条件1) {
// 条件1为真时执行的代码
} else if (条件2) {
// 条件2为真时执行的代码
} else {
// 以上条件都不满足时执行的代码
}
示例:
int score = 75;
if (score >= 90) {
printf("优秀\n");
} else if (score >= 80) {
printf("良好\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
注意条件语句的括号必须完整配对,避免因遗漏括号导致逻辑错误
嵌套过深的 if else 会降低代码可读性,建议通过提前返回或拆分逻辑简化
多重独立 if 可能导致多个分支被执行,而 elif 确保只有一个分支执行。
空 else 块可能掩盖逻辑意图,建议注释或明确处理。
4. switch语句
switch 语句的表达式只能是整数类型(如 int
、char
、enum
)或可以转换为整数类型的表达式。C++ 中允许使用字符串类型,但 C 语言不支持。
基本形式:
switch (表达式) {
case 常量1:
// 代码块1
break;
case 常量2:
// 代码块2
break;
// ...
default:
// 默认代码块
}
示例:
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
// ...
default:
printf("无效的输入\n");
}
注意:每个 case 分支通常需要 break
语句来终止当前分支的执行。若缺少 break
,程序会继续执行后续 case 分支的代码(称为"fall-through"现象)
default
分支用于处理未匹配任何 case 的情况。虽然可选,但建议始终包含 default
分支以提高代码健壮性。
同一个 switch 语句中,所有 case 的值必须是唯一的。重复的 case 值会导致编译错误
在 case 分支中直接声明变量可能导致编译错误。如果需要声明变量,应该使用块作用域。
switch (x) {
case 1:
int y = 10; // 可能产生编译错误
break;
case 2:
{ // 使用块作用域
int z = 20; // 正确
}
break;
}
二、循环结构
循环结构用于重复执行某段代码,C语言提供了以下几种循环结构:
1. while循环
while循环是一种在满足特定条件时重复执行代码块的控制结构。其核心逻辑是条件判断,只要条件为真,循环就会持续执行。
基本形式:
while (条件表达式) {
// 循环体
}
示例:
int i = 1;
while (i <= 5) {
printf("%d ", i);
i++;
}
// 输出:1 2 3 4 5
循环变量需要在循环前正确初始化,并在循环体内适时更新。忽略变量更新会导致逻辑错误或无限循环。还要注意while(里面可能直接进行复值操作)导致死循环
2. do-while循环
基本形式:
do {
// 循环体
} while (条件表达式);
示例:
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 5);
// 输出:1 2 3 4 5
与while的区别:
do-while至少执行一次循环体
while可能一次都不执行
3. for循环
for循环是一种常用的迭代结构,用于重复执行代码块,直到满足特定条件。通常用于遍历序列(如列表、字符串、字典等)或执行固定次数的操作。
基本形式:
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体
}
示例:
for (int i = 1; i <= 5; i++) {
printf("%d ", i);
}
// 输出:1 2 3 4 5
for循环的执行顺序:
执行初始化表达式
判断条件表达式
若条件为真,执行循环体
执行更新表达式
回到第2步
4. 嵌套循环
循环可以嵌套使用,形成多重循环:
示例:
// 打印九九乘法表
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%-2d ", j, i, i*j);
}
printf("\n");
}
三、循环控制语句
1. break语句
用于跳出当前循环或switch结构:
示例:
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当i等于5时跳出循环
}
printf("%d ", i);
}
// 输出:1 2 3 4
2. continue语句
跳过当前循环的剩余部分,直接进入下一次循环:
示例:
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 跳过i=3时的循环
}
printf("%d ", i);
}
// 输出:1 2 4 5
3. goto语句
goto语句是一种控制流语句,允许程序无条件跳转到代码中的指定标签位置。它在许多编程语言中存在,但使用场景和争议较多。
无条件跳转到指定标签处:
示例:
int i = 0;
start:
printf("%d ", i);
i++;
if (i < 5) {
goto start;
}
// 输出:0 1 2 3 4
仅在没有更好结构化替代方案时考虑使用 限制在小型函数或特定算法中使用 添加充分注释说明跳转逻辑 避免交叉跳转和逆向跳转
四、综合应用示例
示例1:判断素数
#include <stdio.h>
#include <stdbool.h>
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);
if (isPrime(num)) {
printf("%d是素数\n", num);
} else {
printf("%d不是素数\n", num);
}
return 0;
}
示例2:计算阶乘
#include <stdio.h>
int main() {
int n;
long long factorial = 1;
printf("请输入一个正整数:");
scanf("%d", &n);
if (n < 0) {
printf("负数没有阶乘\n");
} else {
for (int i = 1; i <= n; i++) {
factorial *= i;
}
printf("%d的阶乘是%lld\n", n, factorial);
}
return 0;
}
示例3:斐波那契数列
#include <stdio.h>
int main() {
int n, t1 = 0, t2 = 1, nextTerm;
printf("请输入项数:");
scanf("%d", &n);
printf("斐波那契数列:");
for (int i = 1; i <= n; i++) {
printf("%d ", t1);
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
}
return 0;
}
五、注意事项
避免死循环:确保循环条件最终能变为假
// 错误示例 - 死循环
while (1) {
// 缺少退出条件
}
浮点数比较:不要直接用==比较浮点数
// 正确做法
double a = 0.1 + 0.2;
if (fabs(a - 0.3) < 0.000001) {
// 认为相等
}
switch-case中的break:忘记break会导致case穿透
switch (x) {
case 1:
printf("1");
// 忘记break
case 2:
printf("2"); // 当x=1时,会执行到这里
break;
}
总结
C语言的分支结构主要通过if
、else if
、else
和switch
语句实现。if
用于单条件判断,else if
和else
扩展多条件分支,switch
适用于多路选择,常与case
和break
配合使用。
循环结构包括while
、do-while
和for
。while
先判断条件后执行,do-while
先执行后判断,for
适合已知循环次数的情况。break
终止循环,continue
跳过当前迭代。
分支和循环是程序逻辑控制的核心,合理使用能提升代码效率和可读性。