2015-02-23 54 views
4

我正在评论C++中的细微点。我发现了一个有趣的问题。你能否检查一下并分享你的推理,为什么它的工作原理如此。为什么局部变量不能隐藏数组定义中的全局变量

谢谢

const int x = 5; 

void func() { 
    // ! Error  
    // int x = x; 

    // ! Fine  
    int x[x]; 
    x[0] = 12; 
    cout << x[0]; 
} 
+0

是什么让你确认它不是躲在'常量int x = 5;'? – 2015-02-23 17:16:43

+0

@πάνταῥεῖ我不明白你的问题,但我想你是问为什么数组定义工作正确?如果是这样,我已经编译并检查了它。 – 2015-02-23 17:19:15

回答

7

声明中变点(即,在该名假定该声明所赋予的涵义,隐藏任何其他实体与一个同名点更广泛的范围)在申报者之后,并且在任何初始者之前。所以这个:

int x = x; 
    ^point of declaration 

初始化局部变量x有自己未初始化值,给未定义行为(尽管它仍然是良好的,所以,除非你要求它编译器应该不会拒绝吧)。

虽然此:

int x[x]; 
     ^point of declaration 

使用说明符,这是良好形成并且良好定义内的全局常量x。这对于读者来说可能会让人困惑,但编译器没有问题。

这一规则的理由是,这是合理的在自己的初始化器使用一个变量的地址(而不是值),一个简单的例子是

void * p = &p; 
+0

为什么void * p =&p正在工作?是不是像int x = x; – 2015-02-24 12:30:37

+1

@MuratKarakuş:它使用变量的地址(在初始化之前定义好),而不是值(未定义)。 – 2015-02-24 12:31:25

+0

谢谢@Mike,我现在明白了 – 2015-02-24 12:33:21