最新的枚举值是否总是高于第一个枚举值?

时间:2013-05-24 08:49:03

标签: objective-c c enums enumeration

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

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

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

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

现在我想检查武器之间的力量差异(假设WoodenSword是最弱的武器而GoldenSword是最强的武器)。是否有可能检查武器的力量做一个简单的事情:

    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;

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

感谢。

5 个答案:

答案 0 :(得分:10)

对于C:

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

  

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

因此,如果未明确设置enum枚举数的值,则保证其大于前一个值。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

如果您不强制使用后续值,则可以依赖它,除非......

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

答案 4 :(得分:0)

或者只使用定义代替enumaration

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

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