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. 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ś.
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.
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ą.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++.
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