如何访问"本地"当a" global"," local"和#34;非常本地化的"变量存在同名

时间:2018-05-19 17:45:26

标签: c++ scope

int i = 1;
int main()
{
    int i = 2;
    {
        int i = 3;
        cout << ::i << endl;  //i want to print 2, neither 1 nor 3
    }
    system("pause");
    return 0;
}

我想打印2.默认情况下,cout&lt;&lt; i&lt;&lt; ENDL;打印3和cout&lt;&lt; :: i&lt;&lt; ENDL;打印1。

2 个答案:

答案 0 :(得分:8)

当嵌套范围中的另一个本地名称隐藏了本地名称时,无法引用本地名称(例如i的{​​{1}}值为2,i的值为3) 。您可以做的最好的事情是在它仍处于范围内时创建对它的引用:

int main()
{
    int i = 2;
    int& middle_i = i;
    {
        int i = 3;
        cout << middle_i << endl;  //will print 2
    }
    system("pause");
    return 0;
}

当然,实际上正确的解决方案不是隐藏您需要访问的名称,因此重命名一个本地i变量。

由于问题也被标记为c,请注意C缺少引用和范围解析运算符(::),所以在C中你会遇到使用指针(甚至更糟)这方面的参考),或者甚至强烈地遵循“实际上正确的解决方案”,而不是隐藏您打算使用的任何名称。

答案 1 :(得分:1)

你可能会误解范围的概念。

具有相同名称始终的本地变量具有优先级。 它没有意义,否则,编译器将如何知道您引用的变量? 在同一父范围内使用具有相同名称的变量被认为是不好的做法,这很明显。重用相同的变量或编写另一个要调用的函数。

你可以创建一个指针来访问外部变量,因为有一个关于C ++的答案,我将在C中给出一个例子

int i = 1;
int* p;
int main()
{
    int i = 2;
    p = &i;
    {
        int i = 3;
        // print *p
    }
    system("pause");
    return 0;
}