C语言流程控制详解:从条件判断到循环结构

C语言流程控制详解:从条件判断到循环结构

C语言的程序默认是顺序执行的,即先执行前面的语句,再执行后面的语句。但实际编程中,我们经常需要根据不同的条件执行不同的代码块,或者重复执行某些操作。这就需要使用流程控制结构来改变程序的执行顺序。本篇博客将详细讲解C语言中的各种流程控制语句。

一、if语句:条件判断基础

if语句是C语言中最基本的条件判断结构,用于根据条件表达式的真假来决定是否执行特定的代码块。

基本语法:

C
1
if (expression) statement

语法说明:

  • expression:条件表达式,必须放在圆括号内
  • statement:当条件为真(非0值)时执行的语句

示例代码:

C
1
2
3
4
5
6
7
8
9
// 单个语句的条件判断
if (x == 10)
printf("x is 10\n");

// 多个语句需要大括号
if (line_num == MAX_LINES) {
line_num = 0;
page_num++;
}

二、if-else语句:双向选择

if-else语句提供了条件不成立时的替代执行路径。

基本语法:

C
1
2
if (expression) statement
else statement

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 找出两个数中的较大值
if (i > j)
max = i;
else
max = j;

// 多行else语句
if (score >= 60) {
printf("及格\n");
pass_count++;
} else {
printf("不及格\n");
fail_count++;
}

三、多重条件判断:if-else if-else

对于多个条件的情况,可以使用else if结构。

语法结构:

C
1
2
3
4
if (expression1) statement1
else if (expression2) statement2
else if (expression3) statement3
else statement4

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 成绩等级判断
if (score >= 90) {
printf("优秀\n");
grade = 'A';
} else if (score >= 80) {
printf("良好\n");
grade = 'B';
} else if (score >= 70) {
printf("中等\n");
grade = 'C';
} else if (score >= 60) {
printf("及格\n");
grade = 'D';
} else {
printf("不及格\n");
grade = 'F';
}

重要提醒: else总是与最近的if匹配,为避免混淆,建议使用大括号明确匹配关系。

四、三元运算符:简洁的条件表达式

三元运算符?:if-else的简洁形式,适用于简单的条件赋值。

语法:

C
1
expression1 ? expression2 : expression3

示例代码:

C
1
2
3
4
5
6
7
8
// 返回两个数中的较大值
int max = (i > j) ? i : j;

// 条件赋值
int result = (x > 0) ? x * 2 : -x;

// 字符串选择
char* message = (success) ? "操作成功" : "操作失败";

等价if语句:

C
1
2
3
4
5
// 上面的三元运算符等价于
if (i > j)
max = i;
else
max = j;

五、switch语句:多分支选择

switch语句用于处理多个固定值的条件判断,比多个if-else更清晰。

基本语法:

C
1
2
3
4
5
switch (expression) {
case value1: statement1
case value2: statement2
default: statement3
}

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 根据成绩等级输出信息
switch (grade) {
case 'A':
printf("优秀\n");
bonus = 100;
break;
case 'B':
printf("良好\n");
bonus = 80;
break;
case 'C':
printf("中等\n");
bonus = 60;
break;
case 'D':
printf("及格\n");
bonus = 40;
break;
default:
printf("不及格\n");
bonus = 0;
break;
}

重要特性:

  1. break语句:每个case分支后通常需要break来跳出switch结构
  2. case穿透:如果没有break,会继续执行下一个case
  3. 多个case共享代码
C
1
2
3
4
5
6
7
8
9
10
11
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31;
break;
case 4: case 6: case 9: case 11:
days = 30;
break;
case 2:
days = (year % 4 == 0) ? 29 : 28;
break;
}

六、while循环:条件循环

while循环在条件为真时重复执行代码块。

语法:

C
1
while (expression) statement

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 基本while循环
int i = 0;
while (i < 10) {
printf("i = %d\n", i);
i++;
}

// 读取用户输入直到特定字符
char ch;
while ((ch = getchar()) != 'q') {
putchar(ch);
}

// 无限循环(需要内部break退出)
while (1) {
// 处理任务
if (should_exit) break;
}

七、do-while循环:后测试循环

do-while循环先执行循环体,再检查条件,保证循环体至少执行一次。

语法:

C
1
do statement while (expression);

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 菜单选择循环
int choice;
do {
printf("请选择(1-3,0退出):");
scanf("%d", &choice);

switch (choice) {
case 1: printf("执行操作1\n"); break;
case 2: printf("执行操作2\n"); break;
case 3: printf("执行操作3\n"); break;
case 0: printf("退出程序\n"); break;
default: printf("无效选择\n");
}
} while (choice != 0);

// 递减循环
int i = 10;
do {
printf("%d ", i);
i--;
} while (i > 0);

八、for循环:计数循环

for循环是最常用的循环结构,特别适合已知循环次数的情况。

语法:

C
1
for (initialization; continuation; action) statement

示例代码:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 基本for循环
for (int i = 0; i < 10; i++) {
printf("i = %d\n", i);
}

// 多变量循环
for (int i = 0, j = 100; i < 10; i++, j -= 10) {
printf("i=%d, j=%d\n", i, j);
}

// 嵌套循环
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("(%d,%d) ", i, j);
}
printf("\n");
}

// 无限循环
for (;;) {
// 循环体
if (exit_condition) break;
}

九、break语句:跳出循环

break语句用于提前退出循环或switch结构。

使用场景:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 在switch中跳出
switch (option) {
case 1:
printf("选项1\n");
break; // 跳出switch
case 2:
printf("选项2\n");
break;
}

// 在循环中提前退出
for (int i = 0; i < 100; i++) {
if (found_target) {
printf("找到目标,提前退出\n");
break; // 跳出整个循环
}
// 继续搜索
}

// 跳出嵌套循环(需要配合goto或标志变量)
int found = 0;
for (int i = 0; i < 10 && !found; i++) {
for (int j = 0; j < 10 && !found; j++) {
if (matrix[i][j] == target) {
found = 1;
break; // 只能跳出内层循环
}
}
}

十、continue语句:跳过本次循环

continue语句跳过当前循环的剩余部分,直接进入下一次循环。

使用示例:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 跳过特定值的处理
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("奇数: %d\n", i);
}

// 跳过无效输入
while ((ch = getchar()) != EOF) {
if (ch == ' ' || ch == '\t' || ch == '\n') {
continue; // 跳过空白字符
}
process_char(ch);
}

十一、goto语句:跳转控制

goto语句可以跳转到指定的标签位置,但应谨慎使用。

语法:

C
1
2
3
goto label_name;
// ...
label_name: statement

使用场景:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 跳出多层嵌套循环
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if (error_condition) {
goto cleanup; // 直接跳出所有循环
}
}
}
}

cleanup:
// 清理资源代码
printf("执行清理操作\n");

// 错误处理跳转
if (function1() == ERROR)
goto error_handler;
if (function2() == ERROR)
goto error_handler;
if (function3() == ERROR)
goto error_handler;

// 正常流程
printf("所有操作成功\n");
return SUCCESS;

error_handler:
printf("发生错误\n");
return ERROR;

十二、流程控制最佳实践

  1. 代码可读性:多用大括号明确代码块范围
  2. 避免深层嵌套:嵌套层次不宜超过3层
  3. 合理使用break/continue:避免过度使用导致逻辑混乱
  4. goto谨慎使用:只在跳出多层循环或统一错误处理时使用
  5. 循环条件明确:确保循环有明确的退出条件

总结

C语言的流程控制结构提供了强大的程序执行控制能力。通过合理组合条件判断和循环结构,可以编写出逻辑清晰、功能强大的程序。关键是要理解每种结构的适用场景,并遵循良好的编程实践,确保代码的可读性和可维护性。


C语言流程控制详解:从条件判断到循环结构
https://www.edenzeng.online/2015/10/12/0.技术栈/01.开发语言/01.C语言/04-流程控制/
作者
Edenzeng
发布于
2015年10月12日
许可协议