C++ 枚举类的超出范围值
当我在函数中定义C++ 枚举类的超出范围值,c++,c++11,enum-class,C++,C++11,Enum Class,当我在函数中定义enum类时,它有一个来自可用选项的值。但是,当我在类中定义它时,它的值没有任何选项。那么g.f的初始值是多少?比较时返回的true是什么((g.f==?)==true) #include <iostream> enum class Fruit { apple, orange }; class Garden { public: Fruit f; }; void print_enum(Fruit f) { switch(f)
enum类时,它有一个来自可用选项的值。但是,当我在类中定义它时,它的值没有任何选项。那么g.f
的初始值是多少?比较时返回的true
是什么<代码>((g.f==?)==true)
#include <iostream>
enum class Fruit
{
apple,
orange
};
class Garden
{
public:
Fruit f;
};
void print_enum(Fruit f)
{
switch(f)
{
case Fruit::apple:
std::cout<<"apple\n";
break;
case Fruit::orange:
std::cout<<"orange\n";
break;
default:
std::cout<<"other\n";
break;
}
}
int main()
{
Garden g;
Fruit f;
print_enum(f); // apple
print_enum(g.f); // other
return 0;
}
#包括
枚举类水果
{
苹果,
橙色
};
班级花园
{
公众:
果实f;
};
无效打印_枚举(f)
{
开关(f)
{
苹果:
STD::CUT总是初始化变量,C++没有用“默认”值在几次内对它们进行初始化。
在这里编写的两种情况下,您都受编译器和操作系统的支配,但很可能会在enum
变量中出现garbage
(这就是您在后一种情况下所做的实验)。如果要查看garbage
是什么,请执行以下操作:
std::cout << (int)g.f << std::endl;
std::cout该标准规定,访问自动存储持续时间的未初始化变量的值会产生未定义的行为
结果是,任何依赖于访问值的操作都会产生未定义的行为
- 将其与另一个值进行比较。例如,如果
a
或b
未初始化,则a==b
给出未定义的行为。如果a
未初始化,则即使比较a==a
也给出未定义的行为
- 将该值分配给另一个变量。例如,
a=b
在b
未初始化时给出未定义的行为
- 按值传递给函数。对于函数
f()
,如果a
未初始化,调用f(a)
将给出未定义的行为
- 输出值。例如,
std::cout Undefined behavior。这里没有可靠的初始值,打印它也会导致其他问题。您必须指定一个值。@deviantfan,我知道这是一个未定义的行为。但为什么它既不是apple
也不是orange
?因为它是UB?您认为UB有意义吗?未初始化的局部变量(如g
和f
)有一个不确定的值。关于所有关于未定义行为的讨论,你可能想要。它是-1875479328
就是这样,人们通常称之为垃圾,但实际上它是在变量使用该空间之前使用该内存的任何内容的值。记住将变量初始化为0
、空
、苹果
或任何在每种情况下都有意义的东西。