【问题标题】:Why is there no increment operator for enums in C? [closed]为什么 C 中的枚举没有增量运算符? [关闭]
【发布时间】:2016-06-30 19:56:00
【问题描述】:

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

为了更清楚

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

现在我问为什么反对bla++ 产生eMember2

用户定义对整数值的赋值,例如

enum myenum {
    eMember1 = 0,
    eMember2 = 10
}

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

【问题讨论】:

  • 我不明白你的问题。您希望5++ 合法或类似吗?
  • 不,问题是要有myEnum x = firstValue; x++; // now x = secondValue
  • 请澄清您的问题。正如 Sourav Ghosh 现已删除的答案所显示的那样,您的问题还不够清楚,无法明确。
  • 这是一个公平的问题,但它询问语言设计者和标准委员会的基本原理,或者更有可能是我们对其基本原理的猜测或意见。就答案必须沉迷于猜测而不是进行分析而言,这个问题在这里是题外话。
  • 这个论点的问题是你假设 ++ 一开始就有意义。它会与语言中的所有其他算术冲突,使所有算术不一致。为什么枚举上的 + 与另一种类型上的 + 相比具有特殊含义?它会在溢出时引入未定义的行为。

标签: c enums operators


【解决方案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?同样,它没有一致的逻辑。

【讨论】:

  • 这不是关于如何找到解决方法,而是关于缺少相应运算符的真正原因。
  • @floquet22 我想知道是否有真正的理由拥有一个,因为这对我来说没有多大意义,请参阅更新的答案。
  • 我有一个类似的问题和观察错误: Unpermitted operand to operator '++' [MISRA 2012 Rule 10.1, required],我不应该做 bla++ 吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    C++ 向前迈进了一步,枚举器开始拥有自己的枚举类型。您也可以为枚举重载运算符 ++,尽管我同意您的观点,这些运算符最好是内置的。

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

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

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

    【讨论】:

    • 如果你有 1、10、100 和 1000 的枚举值,那么现在使用 ++ 的任何地方都必须调用函数或查阅查找表以了解下一步价值会是?
    • @AnttiHaapala 提供适当的目标代码是编译器的工作。例如在 C++ 中有 std::initializer_list 实际上可以模拟枚举。
    • @VladfromMoscow:这将需要在运行时进行额外的工作,因此不适合枚举。
    • @BarryTheHatchet 我同意你的观点,功能越多,复合代码就越多。但是程序员总觉得需要这样一个特性。:)
    • @BarryTheHatchet 在其他更现代的语言(例如 C#)中解决了一些类似的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2016-02-28
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多