4

假设以下简单代码:

for(int i=0; i < 1000; i++)
{
  cout << "Outer i: " << i << endl;
  for(int i=0; i < 12; i++)
  {
    cout << "Inner i:" << i << endl;
  }
}

效果很好。两个循环中使用了相同的变量名,并且输出很好。

我是否正确理解这两个变量都是在堆栈上创建的,并且当外循环进入新的内循环时,会创建一个新的“命名空间”(可能是错误的名称..)?但是为什么会被覆盖?如果我为内部循环中的变量选择另一个名称,我也可以 i从外部循环访问。

我有点困惑。

4

2 回答 2

6

“命名空间”有点接近..但更多的是关于范围。内部 i隐藏/压制外部 i。你可以想到另一个例子:

{ 
 int i=0; //outer scope i.
 {
   int i =0; //this hides the outer scope i.. I can't use outer i here

 }
  i =1 ; //inner i is out of scope.. outer i is set to 1
}
于 2012-11-27T14:27:50.890 回答
3

你的理解是正确的。该代码在技术上是有效的。然而,这种做法有很多问题,因此是一个坏主意。

每个循环都有一个与之关联for的单独范围。在内循环中声明的变量会影响在外循环中声明的变量。没有办法i从内部循环访问外部。

于 2012-11-27T14:27:35.910 回答