C语言控制流结构

概述

本文档详细介绍C语言中的各种控制流结构,包括条件语句、循环语句以及控制循环的特殊语句。控制流结构是程序设计的核心部分,它们允许程序根据不同的条件执行不同的代码块,或者重复执行某些代码块。

条件语句

if-else语句

if-else语句是C语言中最基本的条件语句,用于根据条件的真假执行不同的代码块。

基本语法

1
2
3
4
5
6
7
if (条件表达式) {
// 条件为真时执行的代码
} else if (另一个条件表达式) {
// 第一个条件为假,第二个条件为真时执行的代码
} else {
// 所有条件都为假时执行的代码
}

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 基本if-else示例
int number = 10;

if (number > 0) {
printf("%d 是正数\n", number);
} else if (number < 0) {
printf("%d 是负数\n", number);
} else {
printf("%d 是零\n", number);
}

// 嵌套if-else示例
int age = 25;
if (age >= 18) {
printf("%d岁,已成年", age);
if (age >= 60) {
printf(",且已退休\n");
} else {
printf(",但未退休\n");
}
} else {
printf("%d岁,未成年\n", age);
}

补充示例:判断闰年

1
2
3
4
5
6
7
8
// 判断闰年的示例
int year = 2024;

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}

switch语句

switch语句用于根据变量的值选择执行不同的代码块,适用于多分支条件判断。

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
switch (表达式) {
case1:
// 表达式等于值1时执行的代码
break;
case2:
// 表达式等于值2时执行的代码
break;
// 更多case语句...
default:
// 表达式不等于任何case值时执行的代码
break;
}

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// switch语句示例
char grade = 'B';
switch (grade) {
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("中等\n");
break;
case 'D':
printf("及格\n");
break;
case 'F':
printf("不及格\n");
break;
default:
printf("无效等级\n");
break;
}

补充示例:使用switch判断月份天数

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判断月份天数
int month = 2;
int year = 2024;
int days;

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:
// 判断是否为闰年
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
days = 29;
} else {
days = 28;
}
break;
default:
days = 0;
printf("无效的月份\n");
break;
}

if (days > 0) {
printf("%d年%d月有%d天\n", year, month, days);
}

循环语句

for循环

for循环是一种常用的循环语句,特别适合已知循环次数的情况。

基本语法

1
2
3
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体代码
}

示例代码

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

// 倒序循环
printf("5到1的数字:");
for (int i = 5; i >= 1; i--) {
printf("%d ", i);
}
printf("\n");

// 步长为2的循环
printf("1到10的奇数:");
for (int i = 1; i <= 10; i += 2) {
printf("%d ", i);
}
printf("\n");

补充示例:计算阶乘

1
2
3
4
5
6
7
8
9
// 计算阶乘
int n = 5;
long long factorial = 1;

for (int i = 1; i <= n; i++) {
factorial *= i;
}

printf("%d的阶乘是:%lld\n", n, factorial);

while循环

while循环在条件为真时重复执行循环体,适合不确定循环次数的情况。

基本语法

1
2
3
4
while (条件表达式) {
// 循环体代码
// 通常需要在循环体中修改条件表达式的值,以避免无限循环
}

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 基本while循环
int count = 1;
printf("1到5的数字:");
while (count <= 5) {
printf("%d ", count);
count++;
}
printf("\n");

// 计算1到100的和
int sum = 0;
int num = 1;
while (num <= 100) {
sum += num;
num++;
}
printf("1到100的和:%d\n", sum);

补充示例:猜数字游戏

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
31
// 简单的猜数字游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
int secret_number, guess, attempts = 0;

// 生成1-100之间的随机数
srand(time(0));
secret_number = rand() % 100 + 1;

printf("猜数字游戏:请猜一个1-100之间的数字\n");

while (1) {
printf("请输入你的猜测:");
scanf("%d", &guess);
attempts++;

if (guess < secret_number) {
printf("太小了!\n");
} else if (guess > secret_number) {
printf("太大了!\n");
} else {
printf("恭喜你猜对了!你用了%d次尝试\n", attempts);
break;
}
}

return 0;
}

do-while循环

do-while循环与while循环类似,但它会先执行一次循环体,然后再检查条件是否为真。

基本语法

1
2
3
do {
// 循环体代码
} while (条件表达式);

示例代码

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

// do-while 保证至少执行一次
int j = 10;
printf("即使条件一开始就不满足,do-while也会执行一次:");
do {
printf("%d ", j);
j++;
} while (j <= 5);
printf("\n");

补充示例:菜单选择

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
// 简单的菜单选择示例
int choice;

do {
printf("\n菜单:\n");
printf("1. 选项一\n");
printf("2. 选项二\n");
printf("3. 选项三\n");
printf("4. 退出\n");
printf("请选择(1-4):");
scanf("%d", &choice);

switch (choice) {
case 1:
printf("你选择了选项一\n");
break;
case 2:
printf("你选择了选项二\n");
break;
case 3:
printf("你选择了选项三\n");
break;
case 4:
printf("退出程序\n");
break;
default:
printf("无效的选择,请重新输入\n");
break;
}
} while (choice != 4);

嵌套循环

嵌套循环是指在一个循环内部包含另一个循环,常用于处理二维数组、矩阵等二维结构。

示例代码

1
2
3
4
5
6
7
8
// 打印九九乘法表(前5行)
printf("九九乘法表(前5行):\n");
for (int row = 1; row <= 5; row++) {
for (int col = 1; col <= row; col++) {
printf("%d*%d=%-2d ", col, row, col * row);
}
printf("\n");
}

补充示例:打印金字塔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 打印金字塔
int height = 5;

for (int i = 1; i <= height; i++) {
// 打印空格
for (int j = 1; j <= height - i; j++) {
printf(" ");
}
// 打印星号
for (int k = 1; k <= 2 * i - 1; k++) {
printf("*");
}
printf("\n");
}

控制循环的特殊语句

break语句

break语句用于跳出当前循环或switch语句,执行循环或switch语句之后的代码。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 使用break跳出循环
printf("使用break,当i=3时跳出循环:");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break; // 跳出循环
}
printf("%d ", i);
}
printf("\n");

// 在while循环中使用break
printf("在while循环中使用break,当count=4时跳出:");
int count_break = 1;
while (count_break <= 5) {
if (count_break == 4) {
break;
}
printf("%d ", count_break);
count_break++;
}
printf("\n");

continue语句

continue语句用于跳过当前循环的剩余部分,直接开始下一次循环迭代。

示例代码

1
2
3
4
5
6
7
8
9
// 使用continue跳过当前循环
printf("使用continue,跳过i=3:");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 跳过当前迭代
}
printf("%d ", i);
}
printf("\n");

补充示例:使用continue跳过偶数

1
2
3
4
5
6
7
8
9
// 使用continue跳过偶数
printf("1到10之间的奇数:");
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
printf("%d ", i);
}
printf("\n");

goto语句

goto语句用于无条件跳转到程序中的指定标签位置,应谨慎使用,以免破坏程序的结构。

基本语法

1
2
3
4
goto 标签;
// ...
标签:
// 跳转到这里执行

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 使用goto语句跳出多层循环
int i, j;

for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("i=%d, j=%d\n", i, j);
if (i == 2 && j == 2) {
goto end_loop; // 跳转到标签end_loop
}
}
}

end_loop:
printf("跳出循环\n");

综合示例

示例1:判断素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 判断素数
int num = 17;
int is_prime = 1; // 假设是素数

if (num <= 1) {
is_prime = 0;
} else {
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
is_prime = 0;
break;
}
}
}

if (is_prime) {
printf("%d是素数\n", num);
} else {
printf("%d不是素数\n", num);
}

示例2:斐波那契数列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 打印斐波那契数列的前10项
int n = 10;
int a = 0, b = 1, c;

printf("斐波那契数列的前%d项:\n", n);
printf("%d %d ", a, b);

for (int i = 2; i < n; i++) {
c = a + b;
printf("%d ", c);
a = b;
b = c;
}
printf("\n");

总结

C语言提供了丰富的控制流结构,包括:

  1. 条件语句

    • if-else语句:用于基本的条件判断
    • switch语句:用于多分支条件判断
  2. 循环语句

    • for循环:适合已知循环次数的情况
    • while循环:适合不确定循环次数的情况
    • do-while循环:至少执行一次循环体
    • 嵌套循环:处理二维结构
  3. 控制循环的特殊语句

    • break:跳出当前循环或switch语句
    • continue:跳过当前循环的剩余部分
    • goto:无条件跳转到指定标签(应谨慎使用)

掌握这些控制流结构是编写高效、灵活的C程序的基础。在实际编程中,应根据具体情况选择合适的控制流结构,以提高代码的可读性和执行效率。

control_flow.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <stdio.h>

/**
* @brief 控制流示例程序
* @details 这个程序演示了C语言中各种控制流结构的使用,
* 包括if-else语句、switch语句、for循环、while循环
* 和do-while循环,以及break和continue语句的使用。
* @return 0 表示程序成功执行
*/
int main() {
// =========================
// if-else 语句
// =========================
printf("=== if-else 语句 ===\n");

int number = 10;

if (number > 0) {
printf("%d 是正数\n", number);
} else if (number < 0) {
printf("%d 是负数\n", number);
} else {
printf("%d 是零\n", number);
}

// 嵌套if-else
int age = 25;
if (age >= 18) {
printf("%d岁,已成年", age);
if (age >= 60) {
printf(",且已退休\n");
} else {
printf(",但未退休\n");
}
} else {
printf("%d岁,未成年\n", age);
}

printf("\n");

// =========================
// switch 语句
// =========================
printf("=== switch 语句 ===\n");

char grade = 'B';
switch (grade) {
case 'A':
printf("优秀\n");
break;
case 'B':
printf("良好\n");
break;
case 'C':
printf("中等\n");
break;
case 'D':
printf("及格\n");
break;
case 'F':
printf("不及格\n");
break;
default:
printf("无效等级\n");
break;
}

printf("\n");

// =========================
// for 循环
// =========================
printf("=== for 循环 ===\n");

// 基本for循环
printf("1到5的数字:");
for (int i = 1; i <= 5; i++) {
printf("%d ", i);
}
printf("\n");

// 倒序循环
printf("5到1的数字:");
for (int i = 5; i >= 1; i--) {
printf("%d ", i);
}
printf("\n");

// 步长为2的循环
printf("1到10的奇数:");
for (int i = 1; i <= 10; i += 2) {
printf("%d ", i);
}
printf("\n\n");

// =========================
// while 循环
// =========================
printf("=== while 循环 ===\n");

int count = 1;
printf("1到5的数字:");
while (count <= 5) {
printf("%d ", count);
count++;
}
printf("\n");

// 计算1到100的和
int sum = 0;
int num = 1;
while (num <= 100) {
sum += num;
num++;
}
printf("1到100的和:%d\n\n", sum);

// =========================
// do-while 循环
// =========================
printf("=== do-while 循环 ===\n");

int i = 1;
printf("1到5的数字:");
do {
printf("%d ", i);
i++;
} while (i <= 5);
printf("\n");

// do-while 保证至少执行一次
int j = 10;
printf("即使条件一开始就不满足,do-while也会执行一次:");
do {
printf("%d ", j);
j++;
} while (j <= 5);
printf("\n\n");

// =========================
// 嵌套循环
// =========================
printf("=== 嵌套循环 ===\n");

// 打印九九乘法表(前5行)
printf("九九乘法表(前5行):\n");
for (int row = 1; row <= 5; row++) {
for (int col = 1; col <= row; col++) {
printf("%d*%d=%-2d ", col, row, col * row);
}
printf("\n");
}

printf("\n");

// =========================
// break 和 continue 语句
// =========================
printf("=== break 和 continue 语句 ===\n");

// 使用break跳出循环
printf("使用break,当i=3时跳出循环:");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break; // 跳出循环
}
printf("%d ", i);
}
printf("\n");

// 使用continue跳过当前循环
printf("使用continue,跳过i=3:");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 跳过当前迭代
}
printf("%d ", i);
}
printf("\n");

// 在while循环中使用break
printf("在while循环中使用break,当count=4时跳出:");
int count_break = 1;
while (count_break <= 5) {
if (count_break == 4) {
break;
}
printf("%d ", count_break);
count_break++;
}
printf("\n");

return 0;
}