1

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

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

  • 想象一下,我正在开发一款 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;

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

谢谢。

4

5 回答 5

10

对于 C:

从 C99 标准第6.7.2.2 节枚举说明符

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

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

于 2013-05-24T08:52:25.870 回答
3

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

于 2013-05-24T08:52:37.787 回答
2

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

typedef enum
{
    WoodenSword = 40, //-> equals 40
    IronSword   = 0,  //-> equals 0
    SteelSword  = 42, //-> equals 42
    GoldenSword = 5   //-> equals 5
} WeaponType;
于 2013-05-24T08:51:01.927 回答
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
于 2013-05-24T09:51:03.540 回答
0

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

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

if(type > WoodenSword)
{
   //Do something
} 
于 2013-05-24T12:41:39.430 回答