我遇到了这个for循环布局:
#include <iostream>
int main()
{
{
for (int i = 0; i != 10; ++i)
{
std::cout << "delete i->second;" << std::endl;
}
}
{
for (size_t i = 0; i < 20; ++i)
{
std::cout << "delete m_indices[i];" << std::endl;
}
}
return 0;
}
我想知道这层额外的牙套是干什么用的?这在我们的代码库中出现了几次。
很久以前,在很久以前,VS6 存在并且很受欢迎。然而,它未能符合许多 C++ 标准。这在当时是合理的,因为它是在标准正式发布之前(同年)发布的;然而,据我所知,它确实遵守了标准草案。
在草案和官方标准之间发生变化的标准之一是第一节中创建的 for 循环变量的生命周期;导致以下代码无法编译
{
for (int i=0; i<1; ++i){}
for (int i=0; i<2; ++i){}
}
因为 i
被第二个 for 循环重新定义。
而其他编译器也遇到了这个错误;我强调 VS6 是因为它在标准发布后的几年里仍然是 Visual Studio 的唯一版本,但从未针对这个特定问题发布更新;意味着它产生了更大的影响。
如您所展示的,对此的解决方案是强制整个 for 循环进入其自己的范围。
{
和 }
将创建一个范围,如果您在范围内定义了一些变量,则您无法从外部访问它们。但是 for
已经创建了该范围。所以
{for(int i = 0; i < count; ++i){}}
是相同的
for(int i = 0; i < count; ++i){}
但是如果你在它们之间定义一些东西,那就有区别了
{int a = 0; for(int i = 0; i < count; ++i){}}
在此示例中,无法从外部范围访问 a
。
在您的特定示例中,没有理由使用它们。
有时您可能希望为变量创建范围:
float average;
// ...
{
int sum = 0;
for (int i = 0; i < count; ++i)
{
sum += v[i];
}
average = (float)sum / count;
}
// use average
// sum not in scope here
但是我认为这是一种反模式。通常,如果您发现自己需要这样做,那么 for
很可能应该是它自己的函数。
它是一个用 {}
大括号标记的 block scope。它通常用于标记automatic storage的区域。在您的情况下,它似乎没有做任何事情,因为 for loop 在标准 C++ 中有自己的范围。