C语言程序控制结构:让程序学会思考
一、C语句概述
C程序是由函数构成的,而函数是由语句构成的。C语言中的语句可以分为六类:
分号是语句结束的标志,每一行语句后面通常都要有分号。
二、条件判断语句:if语句
2.1 if语句的基本形式
if语句用于根据条件选择性地执行代码:
// 形式1:单分支
if (条件表达式)
语句;
// 形式2:双分支
if (条件表达式)
语句1;
else
语句2;
// 形式3:多分支
if (条件表达式1)
语句1;
else if (条件表达式2)
语句2;
else if (条件表达式3)
语句3;
else
语句4;
2.2 if语句示例
#include <stdio.h>
int main()
{
int age;
printf("请输入您的年龄:");
scanf("%d", &age);
if (age < 0) {
printf("年龄不能为负数!\\n");
} else if (age < 18) {
printf("您是未成年人。\\n");
} else if (age < 60) {
printf("您是成年人。\\n");
} else {
printf("您是老年人。\\n");
}
return 0;
}
2.3 注意事项
1. 条件表达式的值
if后面的条件表达式最终会被判断为真(非0)或假(0):
int a = 5;
if (a) // 等价于 if (a != 0)
printf("a为真");
if (!a) // 等价于 if (a == 0)
printf("a为假");
2. 悬空else问题
如果有多个if和else,else会与距离它最近的if配对:
// 下面的代码实际上是这样理解的:
int a = 1, b = 2;
if (a > 1)
if (b > 2)
printf("A\\n");
else // 这个else与第二个if配对!
printf("B\\n");
如果想让else与第一个if配对,需要使用花括号:
if (a > 1) {
if (b > 2)
printf("A\\n");
} else {
printf("B\\n");
}
三、多分支选择:switch语句
3.1 switch语句的基本形式
当需要根据一个变量的不同值进行多分支选择时,switch语句比多个if-else更加清晰:
switch (表达式)
{
case 常量1:
语句1;
break;
case 常量2:
语句2;
break;
...
default:
语句n;
}
3.2 switch语句示例
#include <stdio.h>
int main()
{
int day;
printf("请输入星期几(1-7):");
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\\n");
break;
case 2:
printf("星期二\\n");
break;
case 3:
printf("星期三\\n");
break;
case 4:
printf("星期四\\n");
break;
case 5:
printf("星期五\\n");
break;
case 6:
printf("星期六\\n");
break;
case 7:
printf("星期日\\n");
break;
default:
printf("输入错误!\\n");
}
return 0;
}
3.3 break语句的作用
重要:每个case后面的break语句是必需的。如果缺少break,会发生case穿透:
switch (score / 10)
{
case 9: // 90-99分
case 10: // 100分
printf("优秀\\n");
break;
case 8: // 80-89分
printf("良好\\n");
break;
case 7: // 70-79分
printf("中等\\n");
break;
default:
printf("需要努力\\n");
}
在上面的例子中,case 9和case 10会执行相同的代码,这就是利用了case穿透的特性。
3.4 switch注意事项
四、循环结构
4.1 for循环
for循环是最常用的循环结构:
for (表达式1; 表达式2; 表达式3)
{
循环体语句;
}
执行流程:
表达式1(初始化) → 表达式2(判断) → 循环体 → 表达式3(更新) → 表达式2(判断) → …
示例:计算1到100的和
#include <stdio.h>
int main()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
printf("1+2+…+100 = %d\\n", sum);
return 0;
}
for循环的省略形式
for循环的三个表达式都可以省略:
// 省略表达式1:在循环前初始化
int i = 1;
for (; i <= 100; i++)
sum += i;
// 省略表达式2:相当于条件始终为真(死循环)
for (;;)
{
// 无限循环
}
// 省略表达式3:在循环体内部更新
for (int i = 1; i <= 100;)
{
sum += i;
i++;
}
4.2 while循环
while循环在条件为真时重复执行循环体:
while (条件表达式)
{
循环体语句;
}
示例:计算1到100的和
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
while (i <= 100)
{
sum += i;
i++;
}
printf("1+2+…+100 = %d\\n", sum);
return 0;
}
4.3 do-while循环
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("0. 退出\\n");
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("正在进入游戏…\\n");
break;
case 2:
printf("正在播放电影…\\n");
break;
case 3:
printf("正在播放音乐…\\n");
break;
case 0:
printf("再见!\\n");
break;
default:
printf("选择错误!\\n");
}
} while (choice != 0);
return 0;
}
4.4 三种循环的比较
| for | 循环次数已知的情况 |
| while | 循环次数未知,条件控制的情况 |
| do-while | 至少需要执行一次的情况 |
五、循环控制语句
5.1 break语句
break语句用于终止当前循环:
for (int i = 1; i <= 10; i++)
{
if (i == 5)
break; // 当i等于5时,退出整个循环
printf("%d ", i);
}
// 输出:1 2 3 4
5.2 continue语句
continue语句用于跳过本次循环,继续下一次循环:
for (int i = 1; i <= 10; i++)
{
if (i == 5)
continue; // 当i等于5时,跳过本次循环
printf("%d ", i);
}
// 输出:1 2 3 4 6 7 8 9 10
应用示例:计算1到100之间所有偶数的和
int sum = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 2 != 0)
continue; // 跳过奇数
sum += i;
}
六、循环嵌套
循环内部可以再包含循环,这就是循环嵌套:
// 输出9×9乘法表
for (int i = 1; i <= 9; i++)
{
for (int j = 1; j <= i; j++)
{
printf("%d×%d=%d\\t", j, i, i*j);
}
printf("\\n");
}
经典案例:找出100-200之间的所有素数
#include <stdio.h>
#include <math.h>
int main()
{
int count = 0;
for (int n = 100; n <= 200; n++)
{
int isPrime = 1;
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
isPrime = 0;
break;
}
}
if (isPrime)
{
printf("%d ", n);
count++;
}
}
printf("\\n共找到%d个素数\\n", count);
return 0;
}
七、算法思想:打擂算法
在编程中,经常需要找出一组数中的最大值或最小值。这里介绍一种常用的打擂算法(也称为打靶算法):
基本思想:
#include <stdio.h>
int main()
{
int arr[] = {5, 8, 2, 9, 1, 7, 3};
int n = sizeof(arr) / sizeof(arr[0]);
int max = arr[0]; // 假设第一个是最大值
int min = arr[0]; // 假设第一个是最小值
for (int i = 1; i < n; i++)
{
if (arr[i] > max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
printf("最大值:%d\\n", max);
printf("最小值:%d\\n", min);
return 0;
}
八、本章小结
本章我们详细介绍了C语言的程序控制结构:
掌握这些控制结构,就能够编写完整的程序了。在后续章节中,我们将学习数组和函数等更高级的主题。
下一章预告:我们将学习C语言的数组与字符串,这是处理批量数据的基础。





