什么时候使用枚举?

我目前正在阅读C中的枚举。我理解它们是如何工作的,但无法弄清楚它们可能有用的情况。 你能给我一些简单的例子,其中使用枚举是合适的吗?

枚举背后的概念有时也称为“枚举类型”。 也就是说,它是一个类型,其所有可能的值都被命名并列为类型定义的一部分。

C实际上偏离了一点,因为如果ab是枚举中的值,则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来表示相同的概念。 程序员更容易阅读,但对编译器来说意味着相同。