Rick York
Ваше утверждение неверно : у вас есть точный номер точки остановки, потому что он был введен пользователем. Это требует реализации в виде цикла for, потому что это три параметра, которые он использует. Цикл for выглядит следующим образом :
for( Initialize; Condition; Increment )
{
// code executed on every loop iteration
}
Ниже приведен небольшой пример кода, который реализует цикл for, и каждый из трех параметров является вызовом функции. В большинстве циклов они являются простыми операторами, и первая строка каждой из трех функций-это то, как обычно выглядит оператор. Во всяком случае, это задумано как мини-учебник. Я рекомендую вам прочитать дальше для петель, потому что они непосредственно применимы к вашей проблеме.
// for loop example
int Initialize( int init )
{
printf( "Initialize() : returning value of %d\n", init );
return init;
}
bool Condition( int & value, int limit )
{
bool result = ( value < limit );
const char * rstr = result ? "true" : "false";
printf( "Condition() : value is %d - returning %s\n", value, rstr );
return result;
}
void Increment( int & value, int incr )
{
value += incr;
printf( "Increment() : value is now %d\n", value );
}
void main()
{
const int init = -1; // initial value
const int limit = 3; // limit of loop
const int incr = 1; // increment step
printf( "beginning for loop : init is %d, limit is %d, incr is %d\n",
init, limit, incr );
int value;
for( value = Initialize( init ); Condition( value, limit ); Increment( value, incr ) )
{
printf( "for loop body : value is %d\n", value );
}
// the equivalent for loop is :
// for( value = init; value < limit; value += incr )
printf( "exited for loop - value is %d\n", value );
}
Я рекомендую вам скомпилировать и запустить эту программу, чтобы посмотреть, что произойдет. Я сделал операторы функциями, чтобы вы могли видеть точный порядок выполнения каждого оператора. Вы также можете использовать отладчик и пошагово просмотреть программу, чтобы увидеть ее в деталях.
Еще одна очень полезная вещь, которую нужно знать, - это то, как цикл while отличается от цикла for. Самое важное различие заключается в том, что while не имеет инкрементирующего оператора, что означает, что оператор continue будет действовать по-другому. В цикле for continue вызовет переход выполнения к инкрементеру. В цикле while его нет, поэтому он возвращается к условному оператору. Чтобы увидеть это в действии, измените цикл for На this и понаблюдайте за его поведением :
for( value = Initialize( init ); Condition( value, limit ); Increment( value, incr ) )
{
if( value == 1 )
continue;
printf( "for loop body : value is %d\n", value );
}
Имея это в виду, цикл for можно рассматривать как цикл while. Вот эквивалентный цикл while :
// for loop equivalent while loop
printf( "beginning while loop : init is %d, limit is %d, incr is %d\n",
init, limit, incr );
int value = Initialize( init );
while( Condition( value, limit ) )
{
printf( "while loop body : value is %d\n", value );
Increment( value, incr );
}
printf( "exited while loop - value is %d\n", value );
Вот цикл while с оператором continue реализуемым как goto поэтому он ведет себя как цикл for :
// for loop equivalent while loop with pseude-continue
printf( "beginning while loop : init is %d, limit is %d, incr is %d\n",
init, limit, incr );
int value = Initialize( init );
while( Condition( value, limit ) )
{
if( value == 1 )
goto ContinueTarget;
printf( "while loop body : value is %d\n", value );
ContinueTarget :
Increment( value, incr );
}
printf( "exited while loop - value is %d\n", value );
Предупреждение : если вы измените оператор goto на continue, то окажетесь в бесконечном цикле, потому что инкремент будет постоянно пропускаться, а условие всегда будет возвращать true.
И вот еще что напоследок. Поскольку вы видели, как оператор for эквивалентен оператору while, вот как оператор for эквивалентен оператору if с goto. Вот начальный цикл for написанный с помощью только if и goto :
init = Initialize( init );
LoopCondition:
if( ! Condition( value, limit ) )
goto LoopEnd;
printf( "for loop body : value is %d\n", value );
Increment( value, incr );
goto LoopCondition;
LoopEnd:
Надеюсь, вы понимаете, почему люди предпочитают использовать циклы for и while.
В качестве теста для себя добавьте код к последнему фрагменту цикла for, чтобы он вел себя так же, как предыдущий с оператором continue.