Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ For循环在其自身的花括号内_C++_For Loop_Scope - Fatal编程技术网

C++ For循环在其自身的花括号内

C++ For循环在其自身的花括号内,c++,for-loop,scope,C++,For Loop,Scope,我遇到过这样的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)

我遇到过这样的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;
}
#包括
int main()
{
{
对于(int i=0;i!=10;++i)
{

STD::CUT< P>这是一个标记,代码为“{ } RUBES”。它通常用来标记区域。在你的情况下,它似乎不做任何事情,因为它在标准C++中有它自己的范围。

< P>代码> {<代码> >代码>
将创建一个作用域,如果您在该作用域中定义了一些变量,则无法从外部访问它们。但是
for
已经创建了该作用域。因此

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

for(int i = 0; i < count; ++i){}
(int i=0;i 但是,如果你定义了它们之间的某些东西,就会有区别

{int a = 0; for(int i = 0; i < count; ++i){}}
{inta=0;for(inti=0;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
浮动平均;
// ...
{
整数和=0;
对于(int i=0;i

但是我看到这是一种反模式。通常如果你发现你需要这样做,那么最有可能的<代码>应该是它自己的函数。

< P>以前,很多月以前,存在和流行。但是它符合一些C++标准,但是它在它刚刚发布的时候是合理的。(同年)该标准正式发布;但据我所知,它确实遵守了标准草案

在草案和官方标准之间发生变化的标准之一是在第一节中创建的for循环变量的生存期;导致以下代码无法编译

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

对于(int i=0;在C++代码段中,它们是完全多余的),您使用了哪些编译器与此代码一起使用?具体来说,VS 6使用了吗?@ EdNORMAN,现在您的编辑更清晰。看来正确答案是UKMonkey提供的。d生成代码(有人刚刚开始接触Rhapsody)一个可能的原因是代码曾经(或将来打算)有OpenMP并行指令。不需要找到VS6来查看@bolov,在VS2015中将“For Conformance in For Loop Scope”设置为“No”,然后享受;-)@alain“选项'Zc:forScope-'已被弃用,并将在将来的版本中删除"而且编译没有问题……我是sadGCC,2.7版之前的版本也表现出这种行为。请看@Damon,这不是VS6第一次发布的时候;但是,当标准更改时,一个符合它们的更新从未发布。VS6在标准更改后的好几年里一直很流行。这归因于旧的微软编译器是伪造的。这种行为实际上是草稿C++标准的一个特点,并且有许多编译器这样做(不仅仅是微软编译器)。从内存中,在大约1995的草稿中改变它,使变量在环内——大约在C++第一个标准被批准之前的三年。所以大多数C++编译器(大约)1996都是这样工作的。如果你认为它应该在自己的函数中,那就好了。(我可以想很多次,这至少会增加开销,但我不打算去那里)一个假设性的问题:如果你需要一个特定的局部作用域到一个开关案例中,那该怎么办?当然,有时会添加一个额外的作用域(当然函数也会这样做)(注意,对于你的例子,我不知道)(我一点也不认为一个单独的函数是个坏主意)是不必要的,但其他时候,即使有其他方法,它也不是那么简单。