【问题标题】:What is the rule for assignment of the integer value of enum?枚举整数值的赋值规则是什么?
【发布时间】:2017-06-26 23:18:45
【问题描述】:

假设我这样编码:

enum State{
    State0,                //=0
    State1,                //=1
    State2,                //=2
    State5 = State2+3,     //=5
    State6 = State5+1,     //=6
    StateSize = State6+1   //=7
};

我可以在多大程度上依赖这个事实(例如StateSize==7)?

更具体地说,确定它们的值是什么的 C++ 法律/规则是什么?

感觉SO里面可能有这方面的问题,但是找不到。

【问题讨论】:

  • 以防万一,当您不想跟踪它们所代表的整数时,通常您会想要使用枚举。
  • @synchronizer 我也想操作和比较它们。 :)
  • 必须有几个问题以某种形式涵盖这一点,例如this one
  • 请注意,没有什么可以阻止您(除了常识)使用enum State { State0, State1 = -1, State2 = 222, State3, State4 =-1 }; — 这些值不必按递增顺序排列,不必是正数,不必是唯一的。
  • @Shafik Yaghmour 谢谢!现在,我确信这个问题在某种程度上是重复的。另外,感谢 Jonathan Leffler,这对我来说是新知识。

标签: c++ c++11 enums language-lawyer


【解决方案1】:

引用cppreference.com

如果第一个枚举器没有初始化器,则关联的值为零。对于其定义没有初始化器的任何其他枚举器,关联的值是前一个枚举器的值加一。

【讨论】:

    【解决方案2】:

    7.2 枚举声明
    如果第一个枚举器没有初始化器,则 对应的常数为零。没有枚举数的定义 初始化器为枚举器提供通过增加 前一个枚举数的值加一。

    您可以依赖从先前分配的枚举值递增的值。

    enum State{
        State0,     //=0
        State1,     //=1
        State2,     //=2
        State5=5,   //=5
        State6,     //=6
        StateSize   //=7
    };
    

    【讨论】:

      【解决方案3】:

      伪代码:

      initial: cnt = 0
      for each `enumor` in `enum specifier`
      begin
          if `enumor` is in the form of `ID = ConstExp`
              let ID = ConstExp
              cnt = ConstExp
          else
              let ID = cnt
              cnt = cnt + 1
          endif
      end
      

      【讨论】:

      • 设置每个ID的值
      • @MegaStupidMonkeys 我不确定,如果有的话,这个答案可能比其他两个慢,并且它没有按照我的要求引用规范。在这个答案中我可以看到一些努力,也许努力比其他人更大,但是需要太多时间来咀嚼它的知识。
      • @javaLover,我没有引用任何东西,它是我项目“naive-compiler”的一部分,我以伪代码的形式写的:)。
      • 不要让反对票阻止您进一步回答,继续努力。 :)
      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多