为什么C中的枚举没有增量运算符?

时间:2016-03-15 11:36:19

标签: c enums operators

为什么C中的枚举没有增量运算符?即使相应的整数值是用户定义的,我也很有意义地将++迭代到下一个成员。

使其更清晰

typedef enum myenum t_myEnum;
enum myenum {
    eMember1,
    eMember2
}
t_myEnum bla = eMember1;

现在我问一下bla++收益eMember2的原因是什么。

用户定义的整数值分配,如

enum myenum {
    eMember1 = 0,
    eMember2 = 10
}

不应该成为我认为的障碍。

3 个答案:

答案 0 :(得分:1)

我确信它是C和C ++的缺点。

最初的枚举被视为整数常量的集合,作为指令#define的替代。因此,C中的枚举是一组这样的常量的通用名称。它们尽可能简单。:)

在C ++中领先一步,枚举器开始有他们的枚举类型。此外,您可以重载运算符++以进行枚举,但我同意您最好将这些运算符内置。

例如,枚举可以用与C ++中的std :: initializer_list类似的方式实现。

所以在我看来,只有历史原因才会缺少这些运营商。

另一个缺点是无法获得枚举中定义的枚举数。

答案 1 :(得分:1)

我猜想没有这样的算子,因为解决方法是如此微不足道:

typedef enum
{
   eMember1 = 0,
   eMember2 = 10
} myenum;

const myenum TABLE [] =
{
  eMember1,
  eMember2
};


for(size_t i=0; i<sizeof(TABLE)/sizeof(*TABLE); i++)
{
  do_something_with(TABLE[i]);
}

同样,您可以使用const myenum*作为迭代器。

这样的操作员不存在的另一个原因可能是它没有多大意义。让我假装有一个,你认为这个代码会做什么?

myenum e = eMember2;
e++;

代码如eMember1+1的意思是什么?值1还是值10?同样,它没有一致的逻辑。

答案 2 :(得分:1)

C标准中没有任何内容阻止增加enum类型的变量。

在您的示例中,typedef不正确,因为您有enum类型的转发引用,但以下代码演示了我认为您的问题:

#include <stdio.h>

typedef enum myenum {
    eMember1,
    eMember2,
} t_myEnum;

int main(void) {
    t_myEnum bla = eMember1;
    printf("bla=%d\n", bla);
    printf("bla++=%d\n", bla++);
    printf("bla=%d\n", bla);
    return 0;
}

输出:

bla=0
bla++=0
bla=1

当然bla的值只增加1,它可能对应于另一个枚举值,具体取决于枚举类型中枚举值的实际值。

无法枚举给定enum类型的定义值。