在计算初始值时是否定义了变量?
这是我的小程序:在计算初始值时是否定义了变量?
enum Type
{
b = 1,
c = 2
};
int main()
{
Type b = b;
std::cout << b << std::endl;
return 0;
}
我可以断定,上述定义包括这连续的步骤,其输出为0?
- 的
b
声明为类型的可变Type
- 该变量和初始化用
0
默认值 - 评价它的定义是新的值,其包括变量本身(具有值0)
- 分配变量的新价值。
而且,变量是否始终使用0进行初始化,即使它们已被显式初始化?
我的第二个问题是 - 如果它在指定示例中的初始化列表中使用该变量,那么为什么我不明白歧义?编译器是否首先在变量列表中找到b
,然后才检查声明的枚举?
第1步是正确的,但其余是错误的。发生的是变量b
被定义并立即初始化为变量b
的值。这会导致未定义的行为,因为b
未在初始化之前被初始化。
如果你想将它初始化为Type::b
,那么你需要明确地写:
Type b = Type::b;
明白了。为什么它默认使用未初始化的变量而不是Type :: b? –
一旦达到'=',@MisterNobody'b'就在范围内 –
是的,但我的问题不同。考虑'类型b; b = b;'代码,为什么在赋值中使用了变量,而不是'Type :: b'? –
尽管变量被认为是其自身的初始化过程中定义的,它仍然是非法的,以评估其单元的初始化完成。这就是为什么Type b = b
是未定义的行为。
为什么变量定义连的原因是,你可以这样做:
struct X {
int *p;
int a;
};
X x = {&x.a, 123};
cout << *x.p << endl;
使用初始化为目的,而不是自己的评价等是合法的变量。在上面的示例中,x
的初始值设定项必须能够引用x
以便计算其成员的地址a
。这是合法的,因为a
本身没有评估(demo)。
不错的例子,谢谢。 –
不要这样做。你只会把自己和任何必须维护代码的人混淆起来,这些代码将来会包含你。 –
当然,你是对的!我只是试图理解该例子中的语言逻辑。 –