混淆C++全局范围问题

max*_*yne 5 c++ scope global declaration

我正在进行C++实践测试,我对一组访问范围和声明相关问题感到困惑.这两个问题都是彼此相关的.我知道答案......我需要的是正确的解释:

main的末尾的局部变量x的值是多少

 int x = 5;
 int main(int argc, char** argv)
 {
    int x = x;
    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

ans:未定义

主要结束时y的价值是多少?

    const int x = 5;
    int main(int argc, char** argv)
    {
       int x[x];
       int y = sizeof(x) / sizeof(int);
       return 0;
    }
Run Code Online (Sandbox Code Playgroud)

回答:5

pax*_*blo 8

它是由内部x存在时(其范围的开始)控制的.标准状态(当前标准中的3.3.1,即将出现的标准中的3.3.2)部分(我的斜体):

名称的声明点紧跟完整的声明符之后和初始化之前.

有了int x = x;它,它=就是在你指定x的时候创建的,那就是正在使用的内部 x.由于之前没有设置过,所以它是未定义的.

有了int x[x];,内部x就会存在,;所以它使用外部x作为数组大小.


CB *_*ley 8

从标准:3.3.1 [basic.scope.pdecl]

声明的点的名称是立即其完整的声明符(第8条)后,其之前初始化(如果有的话),除了下面提到.

该标准甚至有两个例子来澄清这一点:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用自己的(不确定的)值初始化.

[注意:非本地名称在声明隐藏它的本地名称之前仍然可见.[例:

const int i = 2;
{ int i[i]; }
Run Code Online (Sandbox Code Playgroud)

声明一个包含两个整数的局部数组.]]

这两个例子涵盖了你问题中的两个案例.