Для цикла внутри собственных фигурных скобок
Я столкнулся с этим шаблоном для цикла:
#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;
}
Мне было интересно, для чего нужен этот дополнительный слой брекетов? Это появляется несколько раз в нашей базе кода.
Ответы
Ответ 1
Когда-то давно, много лун назад, VS6 существовал и был популярен. Однако он не соответствовал ряду C++ стандартов; который был разумным в то время, когда он был выпущен незадолго до (в том же году), стандарт был официально выпущен; насколько мне известно, он, однако, придерживался проекта стандарта.
Одним из стандартов, которые изменились между проектом и официальным стандартом, было время жизни переменных цикла, созданных в первом разделе; приводя к следующему коду, который не удалось скомпилировать
{
for (int i=0; i<1; ++i){}
for (int i=0; i<2; ++i){}
}
потому что i
был переопределен вторым циклом.
В то время как другие компиляторы также пострадали от этой ошибки; Я выделяю VS6, потому что он оставался единственной версией visual studio в течение нескольких лет после выпуска стандарта, но никогда не выпускал обновление для этой конкретной проблемы; а это означает, что это оказало более существенное влияние.
Решение этого - заставить весь цикл цикла использовать в своей области, как вы показали.
Ответ 2
{
и }
создаст область действия, и если вы определите некоторые переменные в области, к которым вы не можете получить доступ извне. Но 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
не будет доступен извне.
Ответ 3
Это область блока, отмеченная {}
фигурными скобками. Он обычно используется для обозначения области автоматического хранения. В вашем случае это ничего не делает, поскольку цикл for имеет свою собственную область применения в стандарте C++.
Ответ 4
В вашем конкретном примере нет причин для них.
Иногда вам может понадобиться создать область для переменной:
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
должна быть своя функция.