2016-06-12 104 views
5

这是我的小程序:在计算初始值时是否定义了变量?

enum Type 
{ 
    b = 1, 
    c = 2 
}; 

int main() 
{ 
    Type b = b; 
    std::cout << b << std::endl; 

    return 0; 
} 

我可以断定,上述定义包括这连续的步骤,其输出为0?

  1. b声明为类型的可变Type
  2. 该变量和初始化用0默认值
  3. 评价它的定义是新的值,其包括变量本身(具有值0)
  4. 分配变量的新价值。

而且,变量是否始终使用0进行初始化,即使它们已被显式初始化?

我的第二个问题是 - 如果它在指定示例中的初始化列表中使用该变量,那么为什么我不明白歧义?编译器是否首先在变量列表中找到b,然后才检查声明的枚举?

+0

不要这样做。你只会把自己和任何必须维护代码的人混淆起来,这些代码将来会包含你。 –

+0

当然,你是对的!我只是试图理解该例子中的语言逻辑。 –

回答

7

第1步是正确的,但其余是错误的。发生的是变量b被定义并立即初始化为变量b的值。这会导致未定义的行为,因为b未在初始化之前被初始化。

如果你想将它初始化为Type::b,那么你需要明确地写:

Type b = Type::b; 
+0

明白了。为什么它默认使用未初始化的变量而不是Type :: b? –

+0

一旦达到'=',@MisterNobody'b'就在范围内 –

+0

是的,但我的问题不同。考虑'类型b; b = b;'代码,为什么在赋值中使用了变量,而不是'Type :: b'? –

1

尽管变量被认为是其自身的初始化过程中定义的,它仍然是非法的,以评估其单元的初始化完成。这就是为什么Type b = b未定义的行为

为什么变量定义连的原因是,你可以这样做:

struct X { 
    int *p; 
    int a; 
}; 
X x = {&x.a, 123}; 
cout << *x.p << endl; 

使用初始化为目的,而不是自己的评价等是合法的变量。在上面的示例中,x的初始值设定项必须能够引用x以便计算其成员的地址a。这是合法的,因为a本身没有评估(demo)。

+0

不错的例子,谢谢。 –

相关问题