63. Используйте оператор for, если имеются любые два из инициализурующего, условного или инкрементирующего выражений.
Иначе используйте while. Такой код:
int x = 10;// далее следует 200 строк кода, в которых переменная x не используется
while ( x > 0 )
{
// снова следует 200 строк кода
f( x-- );
}
не очень хорош, даже если вы сэкономили немного времени, соединив операцию декрементирования -- с вызовом функции. Переместите инициализацию и x-- в оператор for. Так как объявление в С++ может располагаться везде, где можно поместить оператор, то вы даже можете объявить x непосредственно перед for: int x = 10;for ( ; x > 0 ; --x )
{
// следует 200 строк кода
f(x);
}
(И хотя вы можете сказать, что в С++ есть возможность сделать for ( int=0;..., такая практика вводит в заблуждение, потому что на самом деле область видимости у x внешняя, как если бы ее объявление было сделано в строке, предшествующей оператору for. Я не рекомендую этого).Если три оператора внутри for слишком длинны, чтобы поместиться в одной строке, то вы можете их отформатировать их следующим образом:
for ( некое_длинное_имя_переменной = f();некое_длинное_имя_переменной ;
некое_длинное_имя_переменной = f() )
{
// ...
}
но часто лучше выделить одно из предложений вот так: int некое_длинное_имя_переменной = f();for ( ; некое_длинное_имя_переменной ; некое_длинное_имя_переменной = f() )
{
// ...
}
или в чрезвычайном случае int некое_чрезвычайно_длинное_имя_переменной = f();for ( ; ; некое_чрезвычайно_длинное_имя_переменной = f() )
{
if ( !некое_чрезвычайно_длинное_имя_переменной )
break;// ...}
Главное - это сосредоточить инициализацию, проверку и инкрементирование в одном месте. Я никогда не сделаю так: int некое_чрезвычайно_длинное_имя_переменной = f();while ( некое_чрезвычайно_длинное_имя_переменной )
{
// много строк кода
некое_чрезвычайно_длинное_имя_переменной = f();
}
потому что это нарушает контроль над циклом.