C语言–分支与循环语句详解
本文全面解析C语言中的分支语句(if
、switch
)和循环语句(while
、for
、do-while
),结合代码示例详细说明其语法、执行流程及常见应用场景,并附实战案例和常见错误分析。
一、分支语句
1. if
语句
if
语句用于根据条件执行不同代码块。其基本语法如下:
单分支结构
#include <stdio.h>
int main() {
int age = 20;
if (age >= 18) {
printf("成年\n");
}
return 0;
}
- 功能:若条件为真(非0),执行代码块;否则跳过。
双分支结构(if-else
)
#include <stdio.h>
int main() {
int age = 15;
if (age >= 18) {
printf("成年\n");
} else {
printf("未成年\n");
}
return 0;
}
- 注意:
else
总是与最近的if
匹配。
多分支结构(if-else if-else
)
#include <stdio.h>
int main() {
int age = 35;
if (age < 18) {
printf("少年\n");
} else if (age < 30) {
printf("青年\n");
} else if (age < 60) {
printf("中年\n");
} else {
printf("老年\n");
}
return 0;
}
- 执行流程:按顺序判断条件,第一个满足条件的分支执行后,后续分支不再检查。
2. switch
语句
switch
适用于多分支选择,需结合 case
和 break
使用。
基本语法
#include <stdio.h>
int main() {
int day = 3;
switch (day) {
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
// ... 其他case
default:
printf("输入错误\n");
}
return 0;
}
- 关键点:
case
后必须是整型常量表达式。break
用于跳出switch
,否则会“穿透”执行后续case
。default
处理未匹配的情况,可放在任意位置。
合并多个 case
#include <stdio.h>
int main() {
int day = 6;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
二、循环语句
1. while
循环
while
循环在条件为真时重复执行代码块。
基本语法
#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
return 0;
}
- 输出:
1 2 3 4 5 6 7 8 9 10
break
与 continue
break
:终止整个循环。while (i <= 10) { if (i == 5) break; printf("%d ", i); // 输出:1 2 3 4 i++; }
continue
:跳过本次循环剩余代码,进入下一轮判断。while (i <= 10) { if (i == 5) { i++; continue; } printf("%d ", i); // 输出:1 2 3 4 6 7 8 9 10 i++; }
2. for
循环
for
循环将初始化、条件判断和调整部分集中在一行,适合已知循环次数的场景。
基本语法
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d ", i); // 输出:1 2 3 4 5 6 7 8 9 10
}
return 0;
}
- 执行顺序:初始化 → 条件判断 → 循环体 → 调整部分 → 条件判断…
break
与 continue
for (int i = 1; i <= 10; i++) {
if (i == 5) break; // 输出:1 2 3 4
if (i % 2 == 0) continue; // 跳过偶数,输出:1 3 5 7 9
printf("%d ", i);
}
3. do-while
循环
do-while
循环至少执行一次循环体,再进行条件判断。
基本语法
#include <stdio.h>
int main() {
int i = 1;
do {
printf("%d ", i); // 输出:1 2 3 4 6 7 8 9 10
i++;
} while (i <= 10);
return 0;
}
三、实战案例
案例1:计算阶乘和
#include <stdio.h>
int main() {
int sum = 0;
for (int n = 1; n <= 10; n++) {
int factorial = 1;
for (int i = 1; i <= n; i++) {
factorial *= i;
}
sum += factorial;
}
printf("阶乘和为:%d\n", sum); // 输出:4037913
return 0;
}
案例2:二分查找
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int key = 7;
int left = 0, right = sizeof(arr)/sizeof(arr[0]) - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] < key) {
left = mid + 1;
} else if (arr[mid] > key) {
right = mid - 1;
} else {
printf("找到元素,下标为:%d\n", mid); // 输出:下标6
break;
}
}
return 0;
}
四、常见错误与注意事项
1. if
语句的悬空 else
if (a == 1)
if (b == 2)
printf("hehe\n");
else // 实际匹配最近的if(b == 2)
printf("haha\n");
- 修正:使用花括号明确代码块范围。
2. switch
中遗漏 break
switch (day) {
case 1:
printf("星期一");
// 无break,会继续执行case 2
case 2:
printf("星期二");
break;
}
3. 循环变量修改不当
for (int i = 0; i < 10; i++) {
if (i == 5) i = 8; // 可能导致无限循环
}
五、总结
- 分支语句:
if
适用于简单条件,switch
适合多分支且条件为整型值的场景。 - 循环语句:
while
适合未知循环次数,for
适合已知次数,do-while
确保至少执行一次。 - 控制关键字:
break
终止循环,continue
跳过本次循环。
通过结合代码示例和实际应用场景,可以更深入理解分支与循环的逻辑,提升代码编写效率和可读性。