Язык Си. Циклы. Операторы перехода (break, continue, return, goto)

Циклы. Операторы перехода (break, continue, return, goto)

лекция № 4 - циклы for, do_while, while


Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом (например, с помощью условного перехода).

В языке Си существует 3 вида циклов.
while( проверка условия );
do{}while( проверка условия );
for( ; проверка условия ; ){}

while(); - перед выполнением тела, идет проверка какого-либо условия,результатом проверки которой является - выполнять тело цикла или нет. предусловие.

do{}while();  проверка условия выполняется в конце тела. постусловие

for( ;проверка условия ; ){} - проверка условия выполняется в конце тела. предусловие
Цикл for имеет 3 секции, разделенных с помощью ;.
for( инициализация (выполняется один раз, в начале цикла); 
проверка условия(выполняется каждый раз перед выполнением тела) ;
выполняется каждый раз после выполнения тела).
В инициалицации можно объявлять переменные(счетчики циклов), или инициализировать какие-то глобальные счетчики каким-то стартовым значением.

Телом цикла называется блок {}, внутри которого находятся инструкции, которые нужно выполнять циклично (определенное колличество раз).
Если инструкций больше чем одна, и они разделены ; то тело оборачивается блоком {}, если же инструкция одна то тело в эти скобки можно не оборачивать. Это справедливо для циклов с предусловием.
Под проверкой условия подразумевается сравнение какого-либо выражение с 0. Если результат выполнения выражения равен 0. Значит тело цикла не выполнять. Смотрите примеры ниже.
#include <stdio.h>
int main()
{
  int i = 0;
 
  while(i)
    printf("loop 1\n");         // блок {} не обязателен, одна инструкция
 
  i = 1;
  while(i < 3)
  {
    printf("loop 2 : %i\n", i);// блок {} обязателен, больше одной инструкции
    i++;
  }
 
  do
  {
    printf("loop 3 : %i\n", i);
    i--;
  }while(i);
 
  for(i = 3; i; i--)           
    printf("loop 4 : %i\n", i); // блок {} не обязателен, одна инструкция
 
  for(int i1 = 0, j1 = 10;
      i1 != j1;
      i1++, j1--)
    printf("loop 5 : %i - %i\n", i1, j1);
 
  return 0;
}
 
Циклы for обычно используются когда есть конкрентое понятие - счетчик итераций, и мы знаем сколько раз должно выполниться тело цикла. Как раз дя этого и есть 3 секции. В других случаях используются оставшиеся циклы. К примеру бесконечный цикл в языке Си выглядит так:
#include <stdio.h>
int main()
{
  while(1)
  {
    // come instructions
  }
  return 0;
}

Также существуют операторы перехода - break, continue, return, goto

break - завершает выполнение цикла.
int main()
{
  int i = 0;
  while(1)
  {
    if(i > 100)
      break;       // завершить цикл
    ++i;
  }
  return 0;
}


continue - выполняет переход в конец тела цикла(то есть после выполнения этого оператора, все что после него игнорируется, происходит переход в конец цикла, и далее начинается новая итерация). В примере ниже, цикл бесконечный, так как при выполнении условия i>2 происходит переход в конец тела цикла, то есть игнорируется увеличение счетчика, а условием выхода из цикла является i==11.
int main()
{
  int i = 0;
  while(i != 11)
  {
    if(i > 2)
      continue;
    ++i;
  }
  return 0;
} 

return - завершает выпонение не то что цикла, а целой функции. Если функция типа void то нужно вызвать просто return; иначе вернуть выражение того типа каким является тип функции.
void foo_a(int aCounterStart, int aCounterEnd, int aExtraCondition)
{
  for(int i = aCounterStart; i < aCounterEnd; ++i)
  {
    if(i == aExtraCondition)
      return;
  }
}
 
int foo_b(int aCounterStart, int aCounterEnd, int aExtraCondition)
{
  for(int i = aCounterStart; i < aCounterEnd; ++i)
  {
    if(i == aExtraCondition)
      return -1;
  }
  return 1;
}
 
int main()
{
  foo_a(0, 4, 4);
  foo_b(0, 4, 2);
  return 0;
}
 
goto - оператор перехода, использование которого я крайне не рекомендую, если на это нет серьезных причин. Причина в том, что использование этого оператора, без веских на то оснований, может затруднять чтение исходного кода программы, затрудняет его понимание, и т.д. что приводит к ошибкам.
Переход осуществляется в рамках одной функции, из одной функции перейти в другую с помощью goto  нельзя. Ниже можете ознакомится с циклом for и его аналогом с помощью оператора goto:
#include <stdio.h>
int main()
{
int i = 0;
 
for(i = 0; i < 10; ++i)
  printf("%i\n", i);
 
printf("----------------------------------------\n\n");
 
goto init;
 
init:
  i = 0;
  goto check_condition;
 
check_condition:
  if(i < 10)
    goto loop_body;
  else
    goto loop_exit;
 
loop_body:
  printf("%i\n", i);
  goto end_body;
 
end_body:
  ++i;
  goto check_condition;
 
loop_exit:
  return 0;
}
 

На этом все. Спасибо за внимание.


















Комментарии

  1. Очень полезные информации спасибо
    Очень полезные информации спасибо

    ОтветитьУдалить

Отправить комментарий