ОГЛАВЛЕНИЕ

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();

}

потому что это нарушает контроль над циклом.