C语言枚举类型的使用及其优越性
枚举类型(enumerated type)是由命名值(named value)的集合所构成的一种数据类型(data type)。
在ansi c中,枚举是一个常量整型值的列表,通常被用于给整形常量分配特定的名字,从而使程序更加可读且易于维护(调试),并且提供额外的类型检查的机会。同时也是对于#define
所定义的宏常量的一种替代。
目录:
- 可读性优越性
- 枚举类型变量与枚举变量的声明与使用
- 类型检查与调试优越性
可读性优越性
为了清晰地展示这种替代在可读性上的优越性,以下是一个例子(月份的符号标识与对应整形常量):
使用#define
的语句定义宏常量,有:
#define jan 1 #define feb 2 #define mar 3 #define apr 4 ... #define dec 12 printf("%d", jan) /* 使用jan的值 */
而若是使用枚举常量,则有:
enum months {jan = 1, feb, mar, apr, ... , dec}; /* 定义名为 months 的枚举类型 */ enum months month = jan; /* 声明 months枚举类型 的枚举变量 month 并赋值 jan */ printf("%d", month); /* 使用jan的值 */
值得注意的是,在没有显式说明的情况下,enum类型中的第一个枚举成员的值为0,第二个为1,以此类推。
如果只指定了部分枚举名的值(jan = 1
),那么未指定值的枚举成员的值将依照最后一个指定值向后递增(feb = 2...
)。
枚举类型变量与枚举变量的声明与使用
如您所见,枚举类型变量(variables of enum types)通过如下的语句声明:
enum <枚举类型变量名> {<枚举常量 1> ...}; /* <枚举常量> 由 <枚举常量标识符(名)>=<整形值> 构成 */
枚举变量(enumeration variables)通过如下的语句声明:
enum <枚举类型变量名> <枚举变量名>;
通过如下语句操作:
<枚举变量名> = <枚举常量标识符>;
通常地,枚举变量将被编译器作为一个整形变量对待,这意味着你可以像使用整形变量一样使用枚举变量。并可以使用自增减运算符来迭代枚举变量。
值得注意的是,与int <variable>
不同,对于枚举变量只应当分配该枚举的有效值(在声明枚举的语句中中有对应的枚举成员)。
类型检查与调试优越性
比起使用#define
去创建一系列的宏常量或使用普通的int <variable>
,使用枚举常量将使你获得一些特殊的益处,正如在k&r c(c程序设计语言)的2.3节中,提到了:
枚举为建立常量值与名字之间的关联提供了一种便利的方式,相对于
#define
语句来说,它的优势在于常量值可以自动生成。尽管可以声明enum
类型的变量,但编译器并不会检查这种类型的变量中存储的值是否为该枚举的有效值。不过,枚举变量提供这种检查的机会(offer the chance of checking),因此枚举比#define
更具优势。此外,调试程序可以以符号形式打印出枚举变量的值。
这意味着:
- 一些debugger会将
enum
视为枚举类型并显示枚举常量的名(符号形式)而不是字面值。(显示jan
,而不是1
) - 更重要的是,这可以是类型检查的一种拓展。虽然并没有被c语言标准所要求,但一些编译器将检查并确保被分配给枚举类型变量的值与其中的枚举常量相对应。(例如
mouth = 13
将不能被确保)
推荐阅读
-
C#编程中枚举类型的使用教程
-
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
-
C#中枚举类型的声明与使用举例
-
C语言中的enum、struct、union——枚举类型、结构体、共用体
-
C#程序编写高质量代码改善的157个建议【4-9】[TryParse比Parse、使用int?来确保值类型也可以为null、readonly和const、0值设为枚举的默认值、避免给枚举类型的元素提供显式的值、习惯重载运算符]
-
C++枚举类型enum与enum class的使用
-
C语言常见数据类型在32位及64位机器上的使用
-
C语言集锦 | 03 - C语言的复合数据类型(typedef关键字、结构体、枚举体、共用体)
-
C语言枚举类型的使用及其优越性
-
C#编程中枚举类型的使用教程