C语言学习之枚举类型

简介: C语言学习之枚举类型

前言

640.jpg


枚举(enum)类型是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。


枚举类型的定义

枚举类型定义的一般形式为:

enum 枚举名
{
    枚举值表
};


在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。

例如:

enum weekday
{
    Mon, Tues, Wed,  Thurs, Fri, Sat, Sun
};


该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。


像上面那样,当不写对应的值,枚举值默认从0开始,即等同于:

enum weekday
{
    Mon = 0,
    Tues = 1,
    Wed = 2,
    Thurs = 3,
    Fri = 4,
    Sat = 5,
    Sun = 6
};


当然,也可以像这样简写:

enum weekday
{
    Mon = 0,
    Tues,
    Wed,
    Thurs,
    Fri,
    Sat,
    Sun
};


这样枚举值就会从0开始递增,和上面的写法是一样的。


枚举变量的说明

如同结构体(struct)和共用体(union)一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:

enum weekday{sun,mon,tue,wed,thu,fri,sat};  //定义枚举类型
enum weekday a,b,c;                         //定义3个枚举类型的变量
enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c; //定义枚举类型的同时,定义3个变量
enum{sun,mon,tue,wed,thu,fri,sat}a,b,c;     //枚举名可省略,但后面不能再定义新的枚举变量


用typedef把枚举类型定义一个别名

typedef enum weekday        //此处的weekday为枚举名
{
    Mon = 0,
    Tues,
    Wed,
    Thurs,
    Fri,
    Sat,
    Sun
}weekday;               //此处的weekday为enum weekday的别名
weekday today, tomorrow;        //枚举类型的变量,即enum weekday类型


当然枚举名也可以省略:

typedef enum    //省略枚举名
{
    Mon = 0,
    Tues,
    Wed,
    Thurs,
    Fri,
    Sat,
    Sun
}weekday;               //此处的weekday为枚举类型的别名
weekday today, tomorrow;        //枚举类型的变量,即enum weekday类型


但是不可以省略类型别名:

typedef enum weekday    
{
    Mon = 0,
    Tues,
    Wed,
    Thurs,
    Fri,
    Sat,
    Sun
};  
weekday today, tomorrow;        //Code::Blocks环境报错


内存的分配

enum是枚举型,所占内存空间恒等于4字;union是共用体,成员共用一个变量缓冲区。


注意

1.不能定义同名的枚举的类型,如:

typedef enum
{
    wednesday,
    thursday,
    friday
} workday;          //定义了一个枚举类型,别名为workday
typedef enum WEEK
{
    saturday,
    sunday = 0,
    monday,
} workday;          //定义了一个枚举类型,别名为workday,重复了


2.不能包含同名的枚举成员

typedef enum
{
    wednesday,      //成员重复
    thursday,           
    friday
} workday_1;
typedef enum WEEK
{
    wednesday,
    sunday = 0,
    monday,
} workday_2;

3.对枚举型的变量赋整数值时,需要进行类型转换。

在Code::Blocks环境测试并不需要进行强制转换,无警告,无错误


单片机开发过程中常用的几个枚举类型

typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE



目录
相关文章
|
11天前
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
19 1
|
11天前
|
编译器 C语言 C++
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
C语言学习记录——位段(内存分配、位段的跨平台、位段的应用)
15 0
|
11天前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
12 1
|
11天前
|
存储 算法 安全
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)
10 0
|
11天前
|
程序员 C语言 C++
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
C语言学习记录——动态内存习题(经典的笔试题)、C/C++中程序内存区域划分
10 0
|
11天前
|
C语言
C语言学习记录——动态内存开辟常见的错误
C语言学习记录——动态内存开辟常见的错误
9 1
|
11天前
|
存储 C语言
C语言学习记录——通讯录(动态内存)
C语言学习记录——通讯录(动态内存)
9 0
|
11天前
|
C语言
C语言学习记录——通讯录(静态内存)
C语言学习记录——通讯录(静态内存)
13 2
|
11天前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
13 2
|
11天前
|
C语言
C语言学习记录——枚举(定义、与结构体的区别、优点)
C语言学习记录——枚举(定义、与结构体的区别、优点)
13 3