2010-12-03 82 views
5

我正在进行C++练习测试,并且对一组访问范围和声明相关问题感到困惑。这两个问题是相互关联other..I知道answers..what我需要的是正确的解释:令人困惑的C++全局范围问题

什么是局部变量x的在主

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

ANS到底值:未定义

y在main的结尾处的值是多少?

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

回答:5

回答

8

它通过在内部x开始存在(其范围的开始)控制。该标准规定(3.3.1在当前的标准,3.3.2在即将到来的一个)部分(我的斜体字):

申报的名点立即其完整的声明符和后在之前它的初始化。

随着int x = x;,它在=的Point的创建,这样当你将x给它,这是正在使用的 X。由于之前没有设置任何内容,因此未定义。

使用int x[x];,内部x;存在,所以它使用外部x作为数组大小。

8

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

一个名字的点声明的立即是其完整的说明符(第8节)之后和其初始化之前(如果有的话),除非如下所述。

标准甚至有两个例子来阐明这一点:

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

这里第二x与其自身的(不确定的)值初始化。

[注意:非本地名称保持可见,直至隐藏它的本地名称声明的位置。 [实施例:

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

声明两个整数的本地阵列。 ]]

这两个例子涵盖了你的问题中的两种情况。