对于自己的花括号内的循环

时间:2018-03-23 10:49:31

标签: c++ for-loop scope

我遇到过这种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;
}

我想知道这个额外的支撑层是什么用的?这在我们的代码库中出现过几次。

4 个答案:

答案 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很可能应该是它自己的功能。