【问题标题】:Why does using the same count variable name in nested FOR loops work?为什么在嵌套 FOR 循环中使用相同的计数变量名称有效?
【发布时间】:2010-03-06 17:44:28
【问题描述】:

为什么下面没有报错?

for (int i=0; i<10; ++i) // outer loop
{
    for (int i=0; i<10;++i) // inner loop
    {
    //...do something
    }
//...do something else
}

按照我的理解,大括号 ({...}) 中的变量仅在这些大括号内。但是内循环在外循环的大括号内。所以一旦我为内部循环声明int i=0,我不应该得到关于多个定义的错误吗?

【问题讨论】:

  • 您现在可能已经这样做了,虽然它有效,但您不应该这样做。它可能会导致可读性降低和一些非常讨厌的错误。
  • 在 Java 或 C 中,这肯定会出错。无论我在什么范围内,Java 都不允许重复的局部变量。在 C++ 的情况下,重复变量可以在不同的范围内初始化(这里范围的意思是 { ... })。运行时变量值的优先级与范围有关。如果内部范围内没有初始化重复变量,则外部范围的变量可以在内部范围内访问。

标签: c++ scoping


【解决方案1】:

您实际上是在创建一个与另一个变量同名的新变量。由于它们在不同的范围内,这是允许的,并且内部范围内的变量“拥有”名称。您将无法访问内部范围内的外部范围i

for 循环声明本身是 for 循环范围的一部分,因此在第二个 i 的情况下算作内部范围的一部分。

【讨论】:

  • @Justin 没有办法访问外部循环的 i 吗?
  • 没有。只需将内部循环的 i 命名为其他名称。通常将嵌套循环索引变量视为字母表中以ijk 等开头的渐进字符。
  • 内部 for 循环不会覆盖外部循环,因为 i 在外部 for 循环中被重新定义了吗?
  • @rahultyagi 如果要访问外部循环的“i”,为什么要在内部 for 循环中重新初始化重复变量。如果您想访问外部循环变量,您应该使用不同的名称初始化变量(在本例中为索引)。
【解决方案2】:

C++ 编译器认为这是有效的,因为第二个的范围仅在 { } 大括号内。如果你在 C 中实现相同的,你会看到这样的错误:

$ gcc test.c
test.c: In function ‘main’:
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode

这在大多数 C 方言中是非法的;这是一个合法的 C++ 声明,因此如果您使用 C++ 编译器编译 C,则可以接受:

for( int i=0; i<5; ++i){}

只有在 C++ 中的循环范围内才有循环迭代器是很常见的,但 C 确保(特别是对于 C90,而不是 C99)声明在循环范围之外。希望对您有所帮助... :-)

因此,当您在旧循环中声明另一个 FOR 循环时,范围会重新开始,并且您的代码在 C++ 或 C99 中编译时不会出现任何错误。这是通常接受的范围声明规范。

【讨论】:

  • 即使在同一范围内使用相同的变量也是相同的概念 - 例如:for(int i=0;i&lt;10;i++){//some code} for(int i=0;i&lt;10;i++){//some other code} 在 C++ 中有效,但在大多数 C 方言中无效。
  • 如果你在 Python 中尝试这个,它也会产生不正确的结果。它将“内部 i”和“外部 i”视为相同。结果,OP 的代码将看到 10 次迭代,而不是 100 次迭代 (10x10)
【解决方案3】:

理解这一点的最佳方法是,当您将 for 循环声明为在该 for 循环的大括号内时,考虑 ( 和 ) 之间的所有内容,至少与范围相关。

为了理解这一点,考虑一个没有声明 x 变量的函数,那么下面的代码会给你一个错误。 (我们还假设您没有全局定义其他 x 变量。)

for (int x = 0; x < 10; x++)
{
    something();
}
x++; // error, x is not defined.

【讨论】:

    【解决方案4】:

    内部循环启动另一个级别的范围,for 循环在循环定义中启动范围,因此第二个 i 在新范围内。

    http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope#Scope_using_other_control_structures

    【讨论】:

      【解决方案5】:

      您确定在执行此操作时没有出错吗......?

      您试图在同一边界内定义两个 int 变量。因此,这将产生错误。在c#中,如果你尝试相同的代码,你会得到错误

      错误 1 ​​无法在此范围内声明名为“i”的局部变量,因为它会给“i”赋予不同的含义,而“i”已在“父或当前”范围中用于表示别的东西

      【讨论】:

      • 是的,我确定....!不,我更了解这个问题,我认为 C++ 行为是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多