我遇到过这种for-loop布局:
#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;
}
我想知道这个额外的支撑层是什么用的?这在我们的代码库中出现过几次。
答案 0 :(得分:287)
很久以前,很多时候,VS6存在并且很受欢迎。然而,它未能符合许多C ++标准;当标准正式发布之前(同年)发布时,这是合理的;然而,就我所知,它确实遵守了标准草案。
草案和官方标准之间发生变化的标准之一是第一部分中创建的for循环变量的生命周期;导致以下代码无法编译
{
for (int i=0; i<1; ++i){}
for (int i=0; i<2; ++i){}
}
因为i
被第二个for循环重新定义。
虽然其他编译器也遇到了这个错误;我强调了VS6的一个,因为它在标准发布后的若干年中仍然是唯一的Visual Studio版本,但从未发布过针对此特定问题的更新;这意味着它产生了更重大的影响。
解决这个问题的方法是将整个for循环强制进入自己的范围,如图所示。
答案 1 :(得分:15)
{
和}
将创建一个范围,如果您在范围中定义了一些变量,则无法从外部访问它们。但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
。
答案 2 :(得分:2)
{}
标有{{1}}个大括号。它通常用于标记block scope的区域。在你的情况下它似乎没有做任何事情,因为automatic storage在标准C ++中有自己的范围。
答案 3 :(得分:2)
在你的特定例子中没有理由。
有时您可能想要为变量创建范围:
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
很可能应该是它自己的功能。