枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。
枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。
定义一个枚举类型,需要使用?enum?关键字,后面跟着枚举类型的名称,以及用大括号?{}?括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从?0?开始递增。
其基本语法格式如下:
enum 枚举名 { 枚举元素1, 枚举元素2, ..., 枚举元素n };
例如,假设你要定义一个星期的枚举类型,可以这样写:
enum Week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
在这个例子中,Week就是我们自定义的枚举类型,Sun、Mon、...、Sat就是枚举元素。
要注意的是,枚举元素其实就是一组整数常量,默认情况下,第一个枚举元素的值为0,之后的每个元素值会默认递增1。以上述的例子为例,Sun的值为0,Mon的值为1,依次类推。
当然,你也可以手动为枚举元素指定值:
enum Week {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat};
在这个例子中,Sun的值为7,Mon的值为1,Tue的值为2,以此类推。注意,一旦手动改变了某个枚举元素的值,其后的枚举元素会在这个基础上递增。
枚举类型广泛应用于很多场合,比如你可能会遇到这种需要从多个固定选项中选择一项的情况,这时候就可以用到枚举。
1、先定义枚举类型,再定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
2、定义枚举类型的同时定义枚举变量
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
3、省略枚举名称,直接定义枚举变量
enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
这三种定义方式都是正确的。
注意元素之间是用逗号分隔的。
#include <stdio.h>
enum Weekdays
{
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
};
int main()
{
enum Weekdays day = Monday;
for (day = Monday; day <= Sunday; day++)
{
printf("%d ",day);
}
return 0;
}
这段代码本身没有问题。
然而,C语言的标准并没有明确规定对枚举类型进行递增或递减运算是允许的,所以按照 C 语言规范是没有办法遍历枚举类型的。这意味着,在一些编译器中,如GCC,这种操作可能会导致编译错误。为了避免这种问题,可以直接使用整数进行循环,并在需要的地方使用类型转换将整数转换为枚举类型,如下所示:
#include <stdio.h>
enum Weekdays
{
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
};
int main()
{
int i = 0;
for (i = Monday; i <= Sunday; i++)
{
printf("%d ",i);
}
return 0;
}
不连续的枚举也是无法遍历的。
enum Color
{
RED,
GREEN = 6,
BLUE
};
这个枚举是无法遍历的。
枚举类型可以配合switch语句实现多个分支选择。
#include <stdio.h>
enum Weekdays
{
Monday, // 0
Tuesday, // 1
Wednesday, // 2
Thursday, // 3
Friday, // 4
Saturday, // 5
Sunday // 6
};
int main()
{
enum Weekdays day = Monday;
switch (day)
{
case Monday:
printf("星期一");
break;
case Tuesday:
printf("星期二");
break;
case Wednesday:
printf("星期三");
break;
case Thursday:
printf("星期四");
break;
case Friday:
printf("星期五");
break;
case Saturday:
printf("星期六");
break;
case Sunday:
printf("星期日");
break;
default :
printf("ERROR!");
break;
}
return 0;
}
由于枚举变量实质上是整型变量,scanf函数不能直接读取控制台输入的枚举常量名并赋值给枚举变量。你可以将输入看作是字符串,然后使用条件语句将字符串转换为相应的枚举值。
#include <stdio.h>
#include <string.h>
// 定义一个枚举类型表示颜色
enum color { RED, GREEN, BLUE };
int main()
{
char input[10];
enum color myColor;
printf("Please enter a color (RED, GREEN, BLUE): ");
scanf("%s", input);
if (strcmp(input, "RED") == 0)
{
myColor = RED;
}
else if (strcmp(input, "GREEN") == 0)
{
myColor = GREEN;
}
else if (strcmp(input, "BLUE") == 0)
{
myColor = BLUE;
}
switch (myColor)
{
case RED:
printf("You have chosen RED.\n");
break;
case GREEN:
printf("You have chosen GREEN.\n");
break;
case BLUE:
printf("You have chosen BLUE.\n");
break;
default:
printf("Invalid color.\n");
}
return 0;
}