2016-03-15 83 views
-1

为什么C中的枚举没有增量运算符?即使相应的整数值是用户定义的,但对我来说,对于下一个成员迭代++确实很有意义。为什么C中的枚举没有增加运算符?

为了更清楚

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

现在我要问什么是对bla++产量eMember2的原因。

用户自定义分配到整数值像

enum myenum { 
    eMember1 = 0, 
    eMember2 = 10 
} 

不应该在我看来是一个障碍。

+2

我不明白你的问题。你想'5 ++'是合法的还是类似的? –

+1

不,问题是有'myEnum x = firstValue; X ++; //现在x = secondValue'。 – Thilo

+1

请说明您的问题。正如Sourav Ghosh现在删除的答案所显示的那样,您还没有明确地表明您的问题是否明确无误。 – fuz

回答

1

我相信这是C和C++的一个缺点。

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

在C++中已经迈出了一大步,枚举器开始具有枚举类型。你也可以重载操作符++进行枚举,尽管我同意你的看法,这些操作符将会更好。

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

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

另一个缺点是不可能获得在枚举中定义的枚举数。

+1

如果你有枚举值为1,10,100和1000,那么现在使用'++'的每个地方都必须调用一个函数或查询下一个值的查找表? –

+1

@AnttiHaapala编译器的工作是提供适当的目标代码。例如在C++中,std :: initializer_list实际上可以模拟枚举。 –

+0

@VladfromMoscow:这需要在运行时多余的工作,因此不适合枚举。 –

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?再一次,它没有一致的逻辑。

+0

这不是关于如何找到解决方法,而是如果没有相应的操作员的真正原因。 – floquet22

+2

@ floquet22我想知道是否有一个真正的理由,因为它对我没有多大意义,请参阅最新的答案。 – Lundin

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类型的定义值。