我正在参加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
答案 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]; }
声明一个包含两个整数的本地数组。 ]
这两个例子涵盖了你问题中的两个案例。