为什么局部变量不会隐藏数组定义中的全局变量

时间:2015-02-23 17:13:33

标签: c++

我现在正在回顾C ++中的微妙观点。我发现了一个有趣的问题。你可以检查一下,并分享你为什么会这样工作的原因。

谢谢

const int x = 5;

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

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

1 个答案:

答案 0 :(得分:7)

变量的声明点(即,名称假定声明赋予它的含义的点,隐藏在更宽范围内具有相同名称的任何其他实体)来自声明者之后,任何初始化者。所以这个:

int x = x;
     ^ point of declaration

使用自己的未初始化值初始化局部变量x,给出未定义的行为(尽管它仍然是格式良好的,因此编译器不应该拒绝它,除非你要求它。)

虽然这个:

int x[x];
        ^ point of declaration

在声明符中使用全局常量x,它是格式良好且定义良好的。这对于人类读者来说可能是令人困惑的,但编译器没有问题。

这条规则的基本原理是在自己的初始化器中使用变量的地址(但不是值)是合理的,一个简单的例子是

void * p = &p;