Do pętli wewnątrz własnych kręconych szelek

Natknąłem się na ten układ 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;
}
Zastanawiałam się, do czego służy ta dodatkowa warstwa szelek? Pojawia się to kilka razy w naszej bazie kodów.
Author: Muntasir, 2018-03-23

4 answers

Dawno, dawno temu, wiele księżyców temu, VS6 istniał i był popularny. Nie udało się jednak dostosować do wielu standardów C++; co było rozsądne w tym czasie, ponieważ został wydany tuż przed (w tym samym roku) standard został oficjalnie wydany; jednak przylegał do projektu standardu o ile mi wiadomo.

Jednym ze standardów, który zmienił się między szkicem a oficjalnym standardem, był czas życia zmiennych pętli for utworzonych w pierwszej sekcji; co prowadzi do braku kompilacji poniższego kodu

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

Ponieważ {[1] } została przedefiniowana przez drugą pętlę for.

Podczas gdy inne Kompilatory również cierpiały na ten błąd; podkreślam VS6, ponieważ pozostawał jedyną wersją visual studio przez wiele lat po wydaniu standardu, ale nigdy nie wydał aktualizacji dla tego konkretnego problemu; co oznacza, że miał bardziej znaczący wpływ.

Rozwiązaniem jest zmuszenie całej pętli for do jej własnego zakresu jako pokazałeś.

 287
Author: UKMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 20:04:30

{ i } utworzy zakres i jeśli zdefiniujesz pewne zmienne w zakresie, nie możesz uzyskać do nich dostępu z zewnątrz. Ale for już Utwórz ten zakres. Więc

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

Jest tym samym co

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

Ale jeśli zdefiniujesz coś między nimi, istnieje różnica

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

W tym przykładzie a nie będzie dostępna z zewnątrz.

 15
Author: cokceken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 16:58:21

W twoim konkretnym przykładzie nie ma powodu dla nich.

Czasami możesz chcieć utworzyć zakres dla zmiennej:

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
Jednak widzę w tym anty-wzorzec. Zazwyczaj, jeśli znajdziesz się w potrzebie zrobienia tego, to najprawdopodobniej for powinna być jego własną funkcją.
 2
Author: bolov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 10:53:44

Jest to Zakres blokowy oznaczony {} szelkami. Jest zwykle używany do oznaczania obszaru automatycznego przechowywania . W Twoim przypadku wydaje się, że nie robi nic, ponieważ pętla for ma swój własny zakres w standardowym C++.

 2
Author: Ron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 11:00:54