【问题标题】:Do C++ enums Start at 0?C++ 枚举是否从 0 开始?
【发布时间】:2016-04-21 01:43:06
【问题描述】:

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

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

我已经找到了post citing that the C99 standard requires a 0 ordinal number。但我知道 C++ 忽略了 C99 标准中的几件事。而且我还找到了post witnessing the compiler using an ordinal value of 1,我似乎也记得看到过,但我不能说那是多久以前的事了。

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

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

【问题讨论】:

  • 下一个枚举常量将始终具有列表中前一个的值。所以在你的情况下,你会得到0, 1, 2, 13, 14, 15...。请注意,这可能会产生重复。
  • @Jonathan Mee 如果与 C 相对的 C++ 中的枚举数不从 0 开始,那就很奇怪了。:)
  • @VladfromMoscow 我同意,显然从答案来看就是这样。我只是找不到任何可以保证 C++ 的东西。如果不需要,我不想继续指定序数 0:S
  • 我很确定这条规则在 C99 中没有改变。也就是说,它是自 C 开始以来的方式。

标签: c++ enums language-lawyer enumeration ordinal


【解决方案1】:

按照该标准 [dcl.enum]

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

强调我的

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

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

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

【讨论】:

【解决方案2】:

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

如果第一个 enumerator 没有 initializer,则对应常量的值为零。没有 initializerenumerator-definitionenumerator 提供通过将前一个 enumerator 的值增加一个。

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

【讨论】:

    【解决方案3】:

    来自第 7.2 节,第 165 页

    。如果第一个枚举器没有初始化器,则对应常量的值为零

    来源:http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多