为什么C中的枚举没有增量运算符?即使相应的整数值是用户定义的,我也很有意义地将++
迭代到下一个成员。
使其更清晰
typedef enum myenum t_myEnum;
enum myenum {
eMember1,
eMember2
}
t_myEnum bla = eMember1;
现在我问一下bla++
收益eMember2
的原因是什么。
用户定义的整数值分配,如
enum myenum {
eMember1 = 0,
eMember2 = 10
}
不应该成为我认为的障碍。
答案 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
类型的定义值。