前置知识:

  1. 常量

枚举的声明和使用

我们有时需要使用一系列相关的常量,使用#define来逐个定义相对较麻烦,C语言提供了枚举类型,来声明一系列枚举常量.

声明一个枚举类型

声明一个枚举类型的语法如下:

1
enum <标识符>{枚举项列表};

其中:

  • 标识符: 该枚举类型的名称
  • 枚举项列表: 用逗号分隔的若干个枚举项,每个枚举项可以有如下2种形式:
    • 枚举常量 属性声明符
    • 枚举常量 属性声明符 = 常量表达式

作为初学者,我们无需关心属性声明符,现阶段将他忽略掉即可.

枚举常量也是一个标识符,他代表了一个具体的枚举常量名.

常量表达式则必须是一个整数常量表达式,其值应该为int类型,用于指示对应枚举常量的值.

同样,以上声明仅是声明了一个枚举类型,我们接下来可以使用该类型来声明若干个变量.

声明枚举的变量

假设我们声明一个枚举类型来用于红绿灯的状态表示:

1
enum light{RED,YELLOW,GREEN};

该枚举可以表示一个信号灯的3种状态,我们接下来使用该枚举类型来"描述"3个信号灯:

1
2
3
4
5
enum light{RED,YELLOW,GREEN};
enum light light1,light2,light3;
light1 = RED;
light2 = YELLOW;
light3 = GREEN;

同样,我们也可以直接将枚举light的3个枚举常量视为3个整数常量,用于比较:

1
2
3
4
5
6
7
8
enum light{RED,YELLOW,GREEN};
enum light light1=RED;
if(light1 == GREEN)
printf("允许通行!");
else if(light1 == RED)
printf("请等待!");
else
printf("注意!");

枚举常量的值

我们在声明枚举的时候,可以为特定的枚举常量使用一个整数常量表达式来指定其值.

枚举常量的值遵循如下规则:

  1. 如果一个枚举常量提供了 =常量表达式 ,那么该常量的值即为该表达式的值.

  2. 如果一个枚举常量未提供 =常量表达式 ,那么该常量的值为同一枚举中前一枚举项的值再+1.

  3. 特别地,如果第一个枚举常量未提供 =常量表达式 ,那么默认为0.

  4. 如果某个枚举常量由其前一个常量的值+1来指定,并且该值发生了溢出回绕,那么他将会:

    1. 适当大小的有符号整数类型,且有能力表示其前一个常量的值+1
    2. 适当大小的无符号整数类型,且有能力表示其前一个常量的值+1

    具体的类型选择取决于其前一个常量的类型,如果不存在这样的可以表示新值的类型,则该枚举不正确(?).

我们举个例子即可基本说明:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main() {
enum color { RED, ORANGE = 3, YELLOW, GREEN = 6, BLUE, PURPLE };
printf("RED = %d ", RED); // 第一个枚举成员,未指定值,默认为0
printf("ORANGE = %d ", ORANGE); // 第二个枚举成员,指定值为3
printf("YELLOW = %d ", YELLOW); //未指定值,默认为前一个成员的值+1,即4
printf("GREEN = %d ", GREEN); // 第四个枚举成员,指定值为6
printf("BLUE = %d ", BLUE); // 未指定值,默认为前一个成员的值+1,即7
printf("PURPLE = %d ", PURPLE); // 未指定值,默认为前一个成员的值+1,即8
return 0;
}

运行结果:

1
RED = 0 ORANGE = 3 YELLOW = 4 GREEN = 6 BLUE = 7 PURPLE = 8

枚举实际上现在用的不是很多,视情况可以选择使用枚举.

注:以上内容为C99标准,C23起有一些新的内容,参阅cppreference文档.

——WAHAHA 2024.3.5



上一篇:C语言教程-14_4-共用体
下一篇:C语言教程-15_1-动态内存分配