Вопрос по поводу циклов

нужен точный ответ. Цикл for и while. Какое утверждение правильное?

  1. Вместо цикла for можно использовать цикл while без изменения алгоритма
  2. Вместо цикла while можно использовать цикл for без изменения алгоритма

Ответы (2 шт):

Автор решения: AlexGlebe

Цикл for - это набор собранный вместе команд для управления циклом. Для удобства записывания цикла. Здесь три команды для управления переменной i.

void f (void) {
  int s = 0 ;
  for (int i = 0 ; i < 10 ; ++ i )
    s += i ; }

То-же самое можно сделять использовав цикл while. Но управление переменной i будет разбросано по всей программе.

void w (void) {
  int s = 0 ;
  { int i = 0 ;
    while ( i < 10 ) {
      s += i ;
      ++ i ; } } }

Алгоритм у этих функций одинаковый. Ответ на первый вопрос : ДА. И на второй : ДА. Всё взаимозаменяемо.


На сладкое: вместо циклов for и while можно заменить на if.

void i (void) {
  int s = 0 ;
  { int i = 0 ;
again :
    if ( i < 10 ) {
      s += i ;
      ++ i ;
      goto again ; } } }

Все три цикла идентичны.

→ Ссылка
Автор решения: Swift

Как цикл for() определен через цикл с проверкой в начале (т.е. while()) в (п 6.8.5)

for ( declaration expressionopt ; expressionopt ) statement

ИЗ ЧЕРНОВИКА С18 (п 6.8.5.3):

for ( clause-1 ; expression-2 ; expression-3 ) statement

behaves as follows: The expression expression-2 is the controlling expression that is evaluated before each execution of the loop body. The expression expression-3 is evaluated as a void expression after each execution of the loop body. If clause-1 is a declaration, the scope of any identifiers it declares is the remainder of the declaration and the entire loop, including the other two expressions; it is reached in the order of execution before the first evaluation of the controlling expression. If clause-1 is an expression, it is evaluated as a void expression before the first evaluation of the controlling expression.

(В С++ declaration назван init-statement, что правильнее отображает его роль как инструкции или определения.)

Следовательно определение из п 6.8.5 является эквивалентом и может быть заменено на

{
   declaration 
   while ( condition )
   {
      statement
      expression ;
   }
}

Такая замена не является "изменение алгоритма", т.к. поведение сохраняется буквально.

Очивидно, что while ( condition ) можно заменить на for(;condition;)

Формально и (1) и (2) верны. (2) верен если условие читается "тело цикла остается неизменным"

особый случай представляет наличие continue. Если statement составной и содержит continue, то таковой является эквивалентом перехода на метку contin, расположенную после конца блока.

for (;;) {
{
// ...here was continue
}
contin: ;
}

while (foo) {
{
// ...here was continue
}
contin: ;
}
→ Ссылка