C 枚举是否从 0 开始?

新手上路,请多包涵

如果我有一个 enum 没有为枚举分配数字,它的序数是否为 0?例如:

 enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

我已经找到了一篇 引用 C99 标准需要 0 序数 的帖子。但我知道 C++ 忽略了 C99 标准中的几件事。而且我还能够找到一个 使用序数值 1 见证编译器的帖子,我似乎也记得看到过,尽管我不能说那是多久以前的事了。

我真的很想看到一个可以证实 C++ 的答案,但我也想知道序数 0 是否成立 ,即使 我在 enum 中间指定了一个值:

 enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

原文由 Jonathan Mee 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

根据该标准 [dcl.enum]

仅使用 enum 的 enum-key 声明的枚举类型是无作用域枚举,其枚举数是无作用域枚举数。 enum-keys 枚举类和枚举结构在语义上是等价的;用其中之一声明的枚举类型是作用域枚举,它的枚举器是作用域枚举器。在范围枚举的声明中不应省略可选标识符。 enum-base 的 type-specifier-seq 应命名为整数类型;任何 cv 限定都将被忽略。声明无范围枚举的 opaqueenum-declaration 不得省略 enum-base。枚举器列表中的标识符被声明为常量,并且可以出现在需要常量的任何地方。带有 = 的枚举器定义为关联的枚举器提供由常量表达式指示的值。 如果第一个枚举器没有初始化器,则相应常量的值为零。 没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值增加一而获得的值。

强调我的

所以是的,如果您不指定起始值,它将默认为 0。

我真的很想看到一个可以证实 C++ 的答案,但我也想知道序数 0 是否成立,即使我在枚举中间指定了一个值:

这也有效。它将从 0 开始并一路递增。然后在枚举之后,您为其分配的值将开始从该值增加一,以供后续枚举器使用。

原文由 NathanOliver 发布,翻译遵循 CC BY-SA 4.0 许可协议

来自 C++11 规范(7.2/2):

如果第一个 枚举 器没有 _初始化器_,则相应常量的值为零。没有 初始化器枚举器定义枚举 器提供了通过将前一个 枚举 器的值增加一而获得的值。

所以是的,枚举中的第一个标识符将具有值零(如果它没有显式初始化为另一个值),并且每个连续的标识符将具有前一个加一的值。

原文由 Some programmer dude 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏