混淆C ++全局范围问题

时间:2010-12-03 08:07:19

标签: c++ scope declaration global

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

末尾的局部变量x的值是多少
 int x = 5;
 int main(int argc, char** argv)
 {
    int x = x;
    return 0;
 }

ans:未定义

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

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

回答:5

2 个答案:

答案 0 :(得分:8)

它由内部x何时成立(其范围的开始)控制。标准状态(当前标准为3.3.1,即将出现的标准为3.3.2)部分(我的斜体):

  

名称的声明点是完整的声明符之后 之前的。

使用int x = x;,它是在=点创建的,这样当您为其分配x时,就是正在使用的内部 x 。由于之前没有设置过任何内容,因此未定义。

使用int x[x];,内部x;出现,因此它使用外部x作为数组大小。

答案 1 :(得分:8)

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

  

名称的声明紧接在其完整声明符(第8节)之后和初始化程序之前(如果有),除非如下所述。

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

int x = 12;
{ int x = x; }
  

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

     

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

const int i = 2;
{ int i[i]; }
  

声明一个包含两个整数的本地数组。 ]

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