Правила программирования на С и С++. Главы 1-6 - Используйте оператор for, если имеются любые два из инициализурующего, условного или инкрементирующего выражений

ОГЛАВЛЕНИЕ

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

}

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