枚举变量默认值?

Has*_*tor 55 c++ variables enums default-value

问题很简单:

#include <iostream>

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4
};

int main() {
    SomeEnum enummy;
    std::cout << (int)enummy;
}
Run Code Online (Sandbox Code Playgroud)

什么是输出?

注意:这不是面试,这是我以前开发人员继承的代码.这里的流操作符只是例如,实际继承的代码没有它.

Arm*_*yan 52

该程序具有未定义的行为.enummy的值是不确定的.从概念上讲,您的代码与以下代码之间没有区别:

int main() {
   int i;          //indeterminate value
   std::cout << i; //undefined behavior
};
Run Code Online (Sandbox Code Playgroud)

如果已在命名空间范围内定义了变量,则将其值初始化为0.

enum SomeEnum {  
    EValue1 = 1,  
    EValue2 = 4,  
};
SomeEnum e; // e is 0
int i;      // i is 0

int main()
{
    cout << e << " " << i; //prints 0 0 
}
Run Code Online (Sandbox Code Playgroud)

不要惊讶于它的e值可能与任何SomeEnum枚举值不同.每个枚举类型具有潜在的积分型(如int,shortlong),并且组枚举类型的对象的可能值的是一组底层积分类型具有值.枚举只是一种方便地命名某些值并创建新类型的方法,但是您不会通过枚举器值的集合来限制枚举的值.

更新:一些报价支持我:

零初始化类型为T的对象意味着:
- 如果T是标量类型(3.9),则将对象设置为0(零)转换为T的值;

请注意,枚举是标量类型.

对T类型的对象进行值初始化意味着:
- 如果T是类型等等等等
- 如果T是非联合类类型等等等等
- 如果T是数组类型,那么等等 - 否则,对象为零-initialized

所以,我们进入其他方面.并且命名空间范围对象是值初始化的

  • 实际上,明确提到了这种特殊情况:ISO/IEC 14882:2003(E)4.1节,左值到右值转换,声明"如果对象未初始化,则需要进行此转换的程序具有未定义的行为." (3认同)
  • @Haspemulator:Armen 的解释隐含或显式地涵盖了许多事情:从未初始化的变量读取、静态的初始化、枚举到整数值的隐式标准转换......恕我直言,期望他识别标准的相关部分是不合理的所有这些,你需要花一些时间阅读 C++ 的基础知识。 (2认同)