在 switch 语句中使用枚举
本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 57 课,共 63 课。
在 C 编程中,最强大的组合之一是将 enum 值与 switch 语句搭配使用。这种组合能创建可读性和可维护性都极高的控制流逻辑,清晰地表达程序的决策过程。
在 switch 语句中使用枚举常量作为 case 时,代码会变得更易读,也能说明自身的含义。你看到的不再是像 case 0: 或 case 5: 这样的神秘数字,而是能直接表达用途的有意义名称:
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}这种方法能让你的代码更容易理解和修改。任何阅读这段代码的人都能立刻知道每种情况代表什么,添加新情况或更改逻辑也会变得简单明了。编译器还能帮助发现错误:如果你拼错了枚举常量,就会收到编译错误,而不是遇到一个悄无声息的 bug。
挑战
简单编写一个 C 程序,使用枚举和 switch 语句构建一个简单的天气建议系统。你的程序应当:
- 定义一个名为
WeatherCondition的enum,并按以下确切顺序列出常量:SUNNYCLOUDYRAINYSTORMYSNOWY
- 编写一个名为
getWeatherAdvice的函数,该函数:- 接受一个名为
weather的enum WeatherCondition参数 - 不返回任何内容(void)
- 使用
switch语句,根据天气条件打印相应的建议:- 对于
SUNNY:打印Perfect day for outdoor activities! - 对于
CLOUDY:打印Good day for a walk, no sun protection needed. - 对于
RAINY:打印Don't forget your umbrella! - 对于
STORMY:打印Stay indoors and avoid travel. - 对于
SNOWY:打印Drive carefully and dress warmly.
- 对于
- 接受一个名为
- 编写一个名为
getActivitySuggestion的函数,该函数:- 接受一个名为
weather的enum WeatherCondition参数 - 不返回任何内容(void)
- 使用
switch语句,根据天气推荐活动:- 对于
SUNNY:打印Suggested activity: Beach or hiking - 对于
CLOUDY:打印Suggested activity: Photography or gardening - 对于
RAINY:打印Suggested activity: Reading or indoor games - 对于
STORMY:打印Suggested activity: Movie marathon - 对于
SNOWY:打印Suggested activity: Skiing or hot cocoa
- 对于
- 接受一个名为
- 在 main 函数中:
- 声明一个类型为
enum WeatherCondition、名为currentWeather的变量 - 从输入中读取一个整数,表示天气条件(0、1、2、3 或 4)
- 根据输入,将对应的枚举值赋给
currentWeather - 按照以下确切格式打印当前天气条件:
Current weather: [numeric_value] - 使用
currentWeather调用getWeatherAdvice函数 - 使用
currentWeather调用getActivitySuggestion函数
- 声明一个类型为
这个挑战展示了将枚举与 switch 语句结合起来,如何创建清晰且易于维护的代码。与其在 switch 语句中使用令人困惑的数字分支,不如使用含义明确的枚举常量,清楚地表达程序逻辑。switch 语句因此能清晰地说明自身含义,让你轻松理解每个分支代表什么,并根据需要修改行为。
亲手试试
#include <stdio.h>
// TODO:在这里定义 WeatherCondition 枚举
// TODO:在这里实现 getWeatherAdvice 函数
// TODO:在这里实现 getActivitySuggestion 函数
int main() {
// 读取输入
int weatherInput;
scanf("%d", &weatherInput);
// TODO:声明 currentWeather 变量,并根据输入为其赋枚举值
// TODO:按 "Current weather: [numeric_value]" 格式输出当前天气状况
// TODO:调用 getWeatherAdvice 函数
// TODO:调用 getActivitySuggestion 函数
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C 在线编译器