什么时候使用枚举?
我目前正在阅读C中的枚举。我理解它们是如何工作的,但无法弄清楚它们可能有用的情况。 你能给我一些简单的例子,其中使用枚举是合适的吗?
枚举背后的概念有时也称为“枚举类型”。 也就是说,它是一个类型,其所有可能的值都被命名并列为类型定义的一部分。
C实际上偏离了一点,因为如果a
和b
是枚举中的值,则a|b
也是该类型的有效值,无论它是否列出和命名。 但是你不必使用这个事实,你可以使用enum作为枚举类型。
只要你想要一个变量,它们的可能值各自代表一个固定的事物列表,它们就是合适的。 当你想要定义一堆相关的编译时常量时,它们有时也是合适的,特别是因为在C中(与C ++不同), const int
不是编译时常量。
我认为他们最有用的属性是:
1)您可以简明地定义一组不同的常量,只要它们不同,您就不会真正关心这些值是什么。 typedef enum { red, green, blue } color;
比以下更好:
#define red 0 #define green 1 #define blue 2
2)程序员在看到color
类型的参数/返回值/变量时,知道什么值是合法的,它们是什么意思(或者无论如何都知道如何查找)。 比将其设为int
更好,但记录“此参数必须是某些标题或其他标题中定义的颜色值之一”。
3)您的调试器在看到color
类型的变量时,可以进行反向查找,并将red
作为值。 比你在源头看自己更好。
4)编译器在看到类型为color
的表达式的switch
时,可能会警告您是否没有default
并且case
列表中缺少任何枚举值。 当你为枚举的每个值做一些不同的事情时,这有助于避免错误。
它们通常用于将相关值组合在一起:
enum errorcode { EC_OK = 0, EC_NOMEMORY, EC_DISKSPACE, EC_CONNECTIONBROKE, EC_KEYBOARD, EC_PBCK };
枚举只是一种声明具有更高可维护性的常量值的方法。 好处包括:
- 编译器可以在不透明时自动分配值。
- 它们可以减轻程序员执行的错误操作,例如
int monday = SUNDAY + 1
。 - 它们使您可以轻松地在一个位置声明所有相关常量。
当你有一个有限的不同相关值列表时,使用它们,就像在一副牌的套装中一样。 当你有一个有效无界的清单或经常变化的清单时,避免使用它们,就像在所有汽车制造商的集合中一样。
有时你想要表达有限和离散的东西。 GNU C编程教程的一个例子是指南针方向。
enum compass_direction { north, east, south, west };
另一个例子,其中枚举对应于整数的能力派上用场,可以是状态代码。 通常你用0开始OK代码,所以它可以在if
结构中使用。
主要使用枚举,因为它们比程序员更容易阅读整数。 例如,您可以创建一个表示一周中的每周的枚举。
enum DAY {Monday, Tuesday....}
星期一相当于整数0,星期二=星期一+ 1等。
因此,不是整数代表每个工作日,您可以使用新类型DAY来表示相同的概念。 程序员更容易阅读,但对编译器来说意味着相同。