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
它是由内部x
存在时(其范围的开始)控制的.标准状态(当前标准中的3.3.1,即将出现的标准中的3.3.2)部分(我的斜体):
名称的声明点紧跟在完整的声明符之后和初始化之前.
有了int x = x;
它,它=
就是在你指定x
的时候创建的,那就是正在使用的内部 x.由于之前没有设置过,所以它是未定义的.
有了int x[x];
,内部x
就会存在,;
所以它使用外部x
作为数组大小.
从标准: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)
声明一个包含两个整数的局部数组.]]
这两个例子涵盖了你问题中的两个案例.