【问题标题】:Confusing C++ global scope issues令人困惑的 C++ 全局范围问题
【发布时间】:2010-12-03 08:07:18
【问题描述】:

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

main末尾的局部变量x的值是多少

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

答案:未定义

main末尾的y值是多少?

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

答案:5

【问题讨论】:

    标签: c++ scope declaration global


    【解决方案1】:

    来自标准:3.3.1 [basic.scope.pdecl]

    名称的声明点紧接在其完整的声明符(第 8 条)之后和其初始化器(如果有)之前,除非下文另有说明。 p>

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

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

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

    [注意:非本地名称在声明隐藏它的本地名称之前一直可见。 [示例:

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

    声明一个由两个整数组成的本地数组。 ]]

    这两个示例涵盖了您问题中的两种情况。

    【讨论】:

      【解决方案2】:

      它由内部x 何时出现(其范围的开始)控制。标准规定(当前标准中的 3.3.1,即将发布的标准中的 3.3.2)部分(我的斜体):

      名称的声明点紧接在之后它的完整声明器和之前它的初始化器。

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

      对于int x[x];,内部x 存在于;,因此它使用外部x 作为数组大小。

      【讨论】:

        猜你喜欢
        • 2018-07-25
        • 2021-05-15
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多