【问题标题】:What can I do with an enum variable?我可以用枚举变量做什么?
【发布时间】:2010-03-23 18:39:20
【问题描述】:

当我像这样声明一个枚举变量时:

enum paint_colors { RED, GREEN, BLUE, ...} colors;

colors 变量有用吗?如果是这样,我能用它做什么?

提前致谢。

【问题讨论】:

  • @drigoSkalWalker,我为你修正了你的语法。我希望我正确理解了这个问题。
  • 我现在对很多答案投了反对票。快枪在那里,先阅读,后开火。他不是在问枚举值,而是在问枚举变量。除了第一个之外的所有答案都完全忽略了这一点。

标签: c variables enums definition typedef


【解决方案1】:

实际上,您正在做的是声明一个与枚举定义的其余部分内联的变量。相当于:

enum paint_colors { RED, GREEN, BLUE };
enum paint_colors colors;

通常,您会看到与定义关联的typedef

typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors;

这让您可以像使用内置类型一样使用枚举:

paint_colors color;

所以你的问题的答案是colors 是一个enum paint_colors 类型的变量,并且可以以任何你认为适合这样一个变量的方式使用:

colors = RED;
if (colors != GREEN)
{
    colors = BLUE;
}

等等。

【讨论】:

  • 它对我来说仍然没用,对于C。我可以使用int或其他类型代替paint_color类型,变量colors仍然没用。
  • @drigoSkalWalker,它可以让你做一些有限的类型检查。如果您不想使用它们,则不必使用它们。不过它可以派上用场。
  • 您现在要问两个问题。 variable 'colors' 是否有用,取决于程序的其余部分。 type 'enum paint_colors' 很有用,因为它传达了这个变量和其他变量的意图和值范围 - 它更加强调什么('这是 3 种颜色之一'),而不是How('这是存储为 int')。
【解决方案2】:

在内部,enum 被视为只能包含有限范围值的整数。在这种情况下,常量REDGREENBLUE、...将被定义并等于012、...(分别)。变量colors 可以在任何可以使用int 的地方使用。您可以使用 ++ 之类的运算符来遍历颜色列表。声明 enum paint_colors colorsint colors 之间的唯一区别是枚举变量 can 应该 分配枚举常量之一。

与使用#define 创建一系列常量和使用普通int 来创建colors 相比,这给您带来了一些好处。首先,一些调试器可以检测到colors 是枚举类型,并会显示枚举常量的名称而不是数值。

更重要的是,这可以添加额外的类型检查层。 C 标准不要求这样做,但一些编译器会检查并确保分配给枚举类型变量的值对应于枚举常量之一。

在心理上,你几乎可以认为这类似于说:

#define RED    0
#define GREEN  1
#define BLUE   2
typedef int paint_colors;
paint_colors colors;

变量被视为int,但明确地赋予它不同的类型有助于阐明变量是什么以及它的用途。

【讨论】:

    【解决方案3】:

    你可以画一个过山车!

    typedef struct {
      Color car;
      Color door_handle;
      Color wheels;
    } RollerCoasterColors;
    
    int main(void) {
      RollerCoasterColors roller_coaster_colors;
      roller_coaster_colors.car = RED;
      roller_coaster_colors.door_handle = YELLOW;
      roller_coaster_colors.wheels = PURPLE;
    
      // now paint_roller_coaster() knows what colour to paint each part!
      paint_roller_coaster(roller_coaster_colors);
    }
    

    【讨论】:

    • 那根本不使用 colors 变量,这是 OP 所要求的。
    【解决方案4】:

    在C中,枚举类型变量是可以迭代的,如++、+;但这在 C++ 中是不允许的;

    enum WEEKDAY {MON, TUE, WED, THU, FRI, SAT, SUN, END};
    for(WEEKDAY day = 0; day < END; day++){
        printf("day index = %d\n", day);
    }
    

    可以用C编译,但不能用C++编译;

    【讨论】:

      【解决方案5】:

      当您有一组给定的可能值时,枚举很有帮助,其中每个值都有一个有意义的名称。在其他地方,您指的是枚举值,而不是“幻数”,这在其他代码中可能变得毫无意义。

      【讨论】:

      • 我认为这不是 OP 所要求的。他想知道colors 有什么用处。
      【解决方案6】:
      enum paint_colors { RED, GREEN, BLUE, ...} colors;
      

      这是您所做的枚举类型声明。 具体回答您的问题,您可以像往常一样声明一个 int 变量,

      enum paint_colors { RED, GREEN, BLUE, ...};
      int colors;
      

      并对 colors 变量执行所有操作,就像您对声明所做的一样。它不会对操作部分产生任何影响。无论是在枚举数常量值之外分配一个整数值,

      colors=1676;    //Valid in both of our case
      

      它的唯一区别是使代码更具可读性和更好理解性,因为枚举类型变量向程序员(特别是调试器)表明了它的用途。取决于你;)

      【讨论】:

        【解决方案7】:

        我发现枚举在调试过程中特别有用。如果您只是使用#define 来定义用作某个变量的值的常量,调试器将向您显示数字。使用枚举,它可以向您显示名称。

        如果您需要单个变量的一组可能值(常量),您可以按照您展示的方式定义它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-26
          • 2013-09-13
          • 2020-11-24
          • 1970-01-01
          • 2010-10-27
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          相关资源
          最近更新 更多