目录
1. 简介
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。
枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。
定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。
枚举语法定义格式为:
enum 枚举名 {枚举元素1,枚举元素2,……};
举个例子:比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
这个看起来代码量就比较多,接下来我们看看使用枚举的方式:
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
这样看起来是不是更简洁了。
2. 初始化
在上面的例子中,我们可以看到魔门指定了MON=1,实际上第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
可以在定义枚举类型时改变枚举元素的值:
enum season {spring, summer=3, autumn, winter};
没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5,下面我们来分别举例看一下:
2.1 默认
#include <stdio.h>
enum DAY
{
MON, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
int main()
{
// 输出所有枚举成员的值
printf("MON = %d\n", MON);
printf("TUE = %d\n", TUE);
printf("WED = %d\n", WED);
printf("THU = %d\n", THU);
printf("FRI = %d\n", FRI);
printf("SAT = %d\n", SAT);
printf("SUN = %d\n", SUN);
return 0;
}
输出结果:
2.2 手动指定
2.2.1 全部指定
#include <stdio.h>
enum DAY
{
MON=9,
TUE=8,
WED=7,
THU=6,
FRI=5,
SAT=4,
SUN=3
};
enum DAY day;
int main()
{
// 输出所有枚举成员的值
printf("MON = %d\n", MON);
printf("TUE = %d\n", TUE);
printf("WED = %d\n", WED);
printf("THU = %d\n", THU);
printf("FRI = %d\n", FRI);
printf("SAT = %d\n", SAT);
printf("SUN = %d\n", SUN);
return 0;
}
输出结果:
2.2.2 部分指定
#include <stdio.h>
enum DAY
{
MON=9,
TUE,
WED,
THU,
FRI=5,
SAT,
SUN
};
enum DAY day;
int main()
{
// 输出所有枚举成员的值
printf("MON = %d\n", MON);
printf("TUE = %d\n", TUE);
printf("WED = %d\n", WED);
printf("THU = %d\n", THU);
printf("FRI = %d\n", FRI);
printf("SAT = %d\n", SAT);
printf("SUN = %d\n", SUN);
return 0;
}
输出结果:
2.2.3 重复指定
#include <stdio.h>
enum DAY
{
MON=9,
TUE,
WED,
THU,
FRI=9,
SAT,
SUN
};
enum DAY day;
int main()
{
// 输出所有枚举成员的值
printf("MON = %d\n", MON);
printf("TUE = %d\n", TUE);
printf("WED = %d\n", WED);
printf("THU = %d\n", THU);
printf("FRI = %d\n", FRI);
printf("SAT = %d\n", SAT);
printf("SUN = %d\n", SUN);
return 0;
}
输出结果:
3. 枚举变量的定义
3.1 先定义枚举类型,再定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
举例:
#include <stdio.h>
enum DAY
{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
int main()
{
enum DAY day;
day = WED;
printf("%d", day);
return 0;
}
3.2 定义枚举类型的同时定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
举例:
#include <stdio.h>
enum DAY
{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
enum DAY day;
day = WED;
printf("%d", day);
return 0;
}
3.3 省略枚举名称,直接定义枚举变量
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
举例:
#include <stdio.h>
enum
{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
} day; // 定义枚举类型并同时声明变量 day
int main()
{
day = WED; // 将 day 设置为 WED
printf("%d", day); // 输出枚举值,WED 对应的值是 3
return 0;
}
4. 枚举对象赋值问题
4.1 枚举量赋给非枚举变量
枚举成员本身是整数常量,编译器会将它们视作 int 类型。因此,可以将枚举量赋给非枚举变量(例如 int 类型的变量),因为编译器会自动将枚举值转换为整数类型。
#include <stdio.h>
enum
{
MON, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
int day = WED; // 枚举量 WED 被赋值给 int 变量 day
printf("day = %d\n", day); // 输出 WED 的值,即 2
return 0;
}
运行结果:
4.2 非枚举量赋给枚举变量
你不能将普通的整数值直接赋给枚举变量。虽然枚举变量背后实际存储的是整数值,但它是一个类型安全的枚举类型,编译器会根据枚举定义进行类型检查。所以,不能直接把一个非枚举量的整数赋值给一个枚举变量,除非这个整数确实对应于枚举的某个成员。
#include <stdio.h>
enum
{
MON, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum { MON, TUE, WED, THU, FRI, SAT, SUN } day;
day = 2; // 错误:尝试将普通的整数值 2 直接赋给枚举类型变量
printf("day = %d\n", day);
return 0;
}
输出结果:
可以从下面的报错提示看出无法从int转换为......。
5. 运用
5.1 使用 for 来遍历枚举的元素
#include <stdio.h>
enum DAY
{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
// 遍历枚举元素,直接使用整数值
for (int day = MON; day <= SUN; day++) {
printf("枚举元素:%d \n", day);
}
return 0;
}
运行结果(这里换了一下编译器,之前用的C++的编译器,其中++会报错):
5.2 在 switch 中的使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
enum color { red=1, green, blue };
enum color favorite_color;
/* 用户输入数字来选择颜色 */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%u", &favorite_color);
/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}
return 0;
}
运行结果: