为什么以下没有给出错误?
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
了内部循环,我不应该得到关于多个定义的错误吗?
您实际上是在创建一个与另一个变量同名的新变量。由于它们在不同的范围内,这是允许的,并且内部范围内的变量“拥有”名称。您将无法访问i
内部范围内的外部范围。
for 循环声明本身是 for 循环范围的一部分,因此在 second 的情况下算作内部范围的一部分i
。
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 循环声明为在该 for 循环的大括号内时,考虑 ( 和 ) 之间的所有内容,至少与范围有关。
为了理解这一点,考虑一个没有声明 x 变量的函数,那么下面的代码会给你一个错误。(我们还假设您没有全局定义其他 x 变量。)
for (int x = 0; x < 10; x++)
{
something();
}
x++; // error, x is not defined.
内部循环启动另一个级别的范围,for 循环在循环定义中启动范围,因此第二个 i 在新范围内。
看
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope#Scope_using_other_control_structures
您确定在执行此操作时没有出错 ....?
您试图在同一边界内定义两个 int 变量。因此,这将产生错误。在c#中,如果你尝试相同的代码,你会得到错误
Error 1 A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'parent or current' scope to denote something else