Отказ от ответственности: я пытался найти похожий вопрос, однако он возвращался ко всем вопросам на C ++ ... Также я был бы благодарен всем, кто мог бы предложить лучший заголовок.
В C ++ есть две выдающиеся структуры цикла: while
и for
.
- Я намеренно игнорирую конструкцию
do ... while
, она не имеет себе равных
- Я знаю
std::for_each
и BOOST_FOREACH
, но не каждый цикл является for each
Теперь я могу быть немного стеснен, но мне всегда хочется исправить код, подобный этому:
int i = 0;
while ( i < 5)
{
// do stuff
++i; // I'm kind and use prefix notation... though I usually witness postfix
}
И преобразовать его в:
for (int i = 0; i < 5; ++i)
{
// do stuff
}
Преимущества for
в этом примере несколько, на мой взгляд:
- Населенный пункт : переменная i живет только в области действия цикла
- Pack : цикл 'control' упакован, поэтому, взглянув только на объявление цикла, я могу понять, правильно ли он сформирован (и будет ли он завершен ...), при условии, конечно, что цикл переменная больше не изменяется внутри тела
- Это может быть встроено, хотя я бы не всегда советовал (что делает для хитрых ошибок)
У меня есть склонность поэтому не использовать while
, за исключением, возможно, идиомы while(true)
, но это не то, что я использовал некоторое время (каламбур). Даже для сложных условий я склонен придерживаться конструкции for
, хотя в нескольких строках:
// I am also a fan of typedefs
for (const_iterator it = myVector.begin(), end = myVector.end();
it != end && isValid(*it);
++it)
{ /* do stuff */ }
Конечно, вы можете сделать это с while
, но тогда (1) и (2) не будут проверены.
Я хотел бы избежать «субъективных» замечаний (типа «мне нравится за / пока лучше»), и мне определенно интересны ссылки на существующие руководства по кодированию / стандарты кодирования.
РЕДАКТИРОВАТЬ :
Я склонен придерживаться (1) и (2), насколько это возможно, (1), потому что рекомендуется локальность >> Стандарты кодирования C ++: пункт 18 , и (2), потому что это делает обслуживание проще, если мне не нужно сканировать весь цикл тела, чтобы найти возможные изменения управляющей переменной (что я принимаю как должное, используя for
, когда 3-е выражение ссылается на переменные цикла).
Однако, как показано ниже gf
, его можно использовать:
while (obj.advance()) {}
Обратите внимание, что это не скандал против while
, а скорее попытка найти, какой из while
или for
использовать, в зависимости от конкретного случая (и по веским причинам, а не просто от симпатии).