【问题标题】:Does the latest enum value will always be higher than the first enum value?最新的枚举值是否总是高于第一个枚举值?
【发布时间】:2013-05-24 08:49:02
【问题描述】:

我有一个关于枚举的问题:当我创建一个枚举时,最新的值是否总是高于枚举的第一个值?

也许举个例子有助于理解我的意思:

  • 假设我正在开发一款 RPG 游戏,其中有武器。每种武器都有一个类型:

    typedef enum
    {
      WoodenSword,
      IronSword,
      SteelSword,
      GoldenSword
    }WeaponType;
    

现在我想检查武器之间的力量差异(假设木剑是最弱的武器,金剑是最强的武器)。是否可以通过简单的方式检查武器的威力:

    WeaponType type = GoldenSword;
    if(type > WoodenSword)
    {
      //Do something
    }

换句话说,我不希望这样,但枚举值是否可能是这样的(如果你不强制该值):

    typedef enum
    {
      WoodenSword, //-> equals 40
      IronSword, //-> equals 0
      SteelSword, //-> equals 42
      GoldenSword //-> equals 5
    }WeaponType;

或者默认是这样的:

    typedef enum
    {
      WoodenSword, //-> equals 0
      IronSword, //-> equals 1
      SteelSword, //-> equals 2
      GoldenSword //-> equals 3
    }WeaponType;

希望足够清楚。如果我不够精确,请随时告诉我。

谢谢。

【问题讨论】:

    标签: objective-c c enums enumeration


    【解决方案1】:

    对于 C:

    来自 C99 标准部分6.7.2.2 枚举说明符

    枚举器列表中的标识符被声明为具有 int 类型的常量,并且可以出现在任何允许的地方。98) 带有 = 的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常数的值为0。后面的每个没有=的枚举数将其枚举常数定义为前一个枚举常数的值加1得到的常数表达式的值。 (使用带 = 的枚举数可能会生成枚举常量,其值与同一枚举中的其他值重复。)枚举的枚举数也称为其成员。

    因此,如果 enum 枚举器的值未明确设置,则它保证比前一个值大一。

    【讨论】:

    • 我们确定 ObjC 需要遵循 C 标准吗? :-)
    • 好的,我现在就给你+1,因为你已经引用了标准。
    • 感谢您的回答 :)(objective-C 依赖于 C 标准,所以我想该标准也适用于 Objective-C)
    • 所有 Objective-C 文件都使用参数 -std=N、-std=c99 和 clang 4.1 或 gcc 4.2 编译。所以是的,我们确信 ObjC 遵循 C 标准。 (-std=c89 用于 Objective-C 1,如果我记得 weel)
    【解决方案2】:

    C/C++ 保证如果你不强制值,枚举中的任何下一个非强制值都将是previous + 1。

    【讨论】:

    • 而 C++ 与这个问题有什么关系究竟是什么
    • @paxdiablo 其他对 C++ 有完全相同问题的用户可能会像我一样通过 Google 搜索偶然发现此页面。
    【解决方案3】:

    是的,默认行为是您描述的方式。要获得其他行为,您需要设置如下值:

    typedef enum
    {
        WoodenSword = 40, //-> equals 40
        IronSword   = 0,  //-> equals 0
        SteelSword  = 42, //-> equals 42
        GoldenSword = 5   //-> equals 5
    } WeaponType;
    

    【讨论】:

      【解决方案4】:

      如果你不强制后续值你可以依赖它,除非...

      root@debian:/home/david# cat demo.c
      #include <stdio.h>
      #include <limits.h>
      
      enum {a = INT_MAX, b};
      
      int main(void)
      {
          printf("a=%d b=%d\n", a, b);
          return 0;
      }
      
      root@debian:/home/david# clang -o demo demo.c
      demo.c:4:20: warning: overflow in enumeration value
      enum {a = INT_MAX, b};
                         ^
      1 warning generated.
      root@debian:/home/david# ./demo
      a=2147483647 b=-2147483648
      

      【讨论】:

        【解决方案5】:

        或者只使用定义而不是枚举

        #define IronSword      0
        #define GoldenSword    5
        #define WoodenSword   40
        #define SteelSword    42
        

        if(type > WoodenSword)
        {
           //Do something
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-29
          • 2021-10-21
          • 1970-01-01
          • 2015-02-12
          • 1970-01-01
          • 2020-11-11
          相关资源
          最近更新 更多