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。
答案 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;
}