这个问题很简单:
#include <iostream>
enum SomeEnum {
EValue1 = 1,
EValue2 = 4
};
int main() {
SomeEnum enummy;
std::cout << (int)enummy;
}
输出会是什么?
注意:这不是一次面试,这段代码是我从之前的开发者那里继承来的。这里使用的流操作符只是举例,实际继承的代码并没有它。
这个问题很简单:
#include <iostream>
enum SomeEnum {
EValue1 = 1,
EValue2 = 4
};
int main() {
SomeEnum enummy;
std::cout << (int)enummy;
}
输出会是什么?
注意:这不是一次面试,这段代码是我从之前的开发者那里继承来的。这里使用的流操作符只是举例,实际继承的代码并没有它。
该程序存在未定义行为。枚举变量enummy的值是不确定的。从概念上讲,您的代码和以下代码之间没有区别:
int main() {
int i; //indeterminate value
std::cout << i; //undefined behavior
};
enum SomeEnum {
EValue1 = 1,
EValue2 = 4,
};
SomeEnum e; // e is 0
int i; // i is 0
int main()
{
cout << e << " " << i; //prints 0 0
}
e
可以具有与任何 SomeEnum
枚举值不同的值。每个枚举类型都有一个底层整数类型(如 int
、short
或 long
),该枚举类型对象的可能值集是底层整数类型具有的值集。枚举只是一种方便地命名一些值并创建新类型的方式,但您不会将枚举的值限制为枚举器值的集合。
更新: 一些支持我的引用:
对类型 T 的对象进行零初始化意味着:
— 如果 T 是标量类型(3.9),则将对象设置为转换为 T 的值为 0(零)的值;
请注意,枚举是标量类型。
对类型 T 的对象进行值初始化意味着:
— 如果 T 是类类型
blah blah
— 如果 T 是非联合类
类型 blah blah
— 如果 T 是数组类型,则 blah blah —
否则,对象将被零初始化
因此,我们进入了“否则”部分。命名空间范围的对象将被值初始化。