局部变量如何隐藏全局变量

时间:2017-03-12 04:48:05

标签: c++ c++11

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

const int x = 5;
int main(int argc, char** argv)
{
    int x[x];

    int y = sizeof(x) / sizeof(int);

    return 0;
}
  

y是5

main的末尾的局部变量x的值是什么?

int x = 5;
int main(int argc, char** argv)
{
    int x = x;
    return 0;
}
  

x未定义

1 个答案:

答案 0 :(得分:1)

宣布

int x[x];

全局x用于定义数组的大小。 x中的[]是全局变量,因为局部变量的声明尚未完成。

在第二种情况下,

int x = x;

是未定义的行为,因为RHS上的x与LHS上的x相同,因为x的声明在时间x上完成遇到RHS。

这些在C ++ 11标准中描述:

  

3.3.2声明要点

     

1名称的声明紧跟在其完整的声明者(第8条)之后和其初始化者之前(如果有的话),除非如下所述。 [示例:

     

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

     

这里第二个x用它自己的(不确定的)值初始化。 - 结束示例]

     

2 注意:来自外部作用域的名称在隐藏它的名称声明之前仍然可见。[示例:

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

声明一个包含两个整数的块范围数组。 - 结束示例] - 结束记录]