Условные операторы языка программирования C++, страница 6

          2.6 Оператор goto и метки

Метка представляет собой идентификатор с расположенным за ним символом двоеточия (:).

          Метками помечают какой-либо оператор, на который в даль­нейшем должен быть осуществлен безусловный переход.

          Безусловная передача управления на метку производится при помощи оператора goto.

          Оператор goto может осуществлять переход (адресоваться) к меткам, обязательно расположенным в одном с ним теле функции.

Синтаксис оператора goto:

goto метка;

          Данный оператор - очень мощное и небезопасное средство управления поведением программы. Использовать его нужно крайне осторожно, так как, например, "прыжок" внутрь цикла (обход кодов инициализации) может привести к трудно локали­зуемым ошибкам.

          Рассмотрим пример применения оператора goto.

#include <iostream.h>

voidmain ()

{

   // Инициализация переменных

   ...

if(...)

   {

   // Если условие выполнено, производим

   //какие-то действия и переходим

   //к оператору по метке label

      ...

      gotolabel;

}

   ...

   label;

   ...

}

          Как только выполнение программы достигнет оператора goto, управление будет передано оператору, следующему за меткой label.

          Вообще говоря, использование структурного и объектно-ориентированного подходов к программированию позволяет полностью отказаться от применения операторов безусловного перехода. Однако на практике часто бывают случаи, когда goto

значительно упрощает код программы. В особенной степени это утверждение касается вложенных конструкций switch-case и if-else.

          В качестве примера вернемся к модели светофора, дополнив ее соответствующим образом:

#include <iostream.h>

void main ()

{

   enum lighter {RED, REDYELLOW, YELLOW, GREEN} ;

   lighter current = YELLOW;

   lighter previous = GREEN;

   lighter next = RED;

start:

   switch(current)

   {

      case RED:

         cout << "СТОП!!?\n";

         if(previous = YELLOW)

         {

            next = REDYELLOW;

            break;

         }

         else

            goto lab1;

   case REDYELLOW:

      if(previous = YELLOW)

         goto labl;

      if(previous = GREEN)

         goto labl;

      cout << "Приготовиться.\n";

      next = GREEN;

      break;

case YELLOW:

   if(previous = YELLOW)

      goto labl;

   if(previous = RED)

      goto labl;

   cout << "Остановись\n";

   next = RED;

   previous = GREEN;

   break;

case GREEN:

   if(previous == RED)

      goto labl;                       

      if(previous = YELLOW)

      goto labl;

   previous = REDYELLOW;

   next = YELLOW;

   cout << "Вперед!\n";

   break;

}

   previous = current;

   current = next;

   goto start;

labl:

   cout << "Светофорнеисправен..,\n";

   current -- previous = next = YELLOW;

   goto start;

}

          В приведенной программе объявляются три переменные для хранения информации о текущем (current), предыдущем (previous) и следующем (next) состоянии светофора. В опе­раторе switch производится анализ текущего состояния и на основании полученного результата осуществляется вывод соот­ветствующего сообщения. В случае сбоя работы светофора (рас­считанные значения переменных next и previous не совпада­ют с реальными данными), осуществляется переход к метке lab1 с последующим переводом светофора в режим "Неуправляемый перекресток". После проверки выполнение программы продолжа­ется с метки start.


Содержание

1. Условные операторы.. 1

1.1 Операторы if 1

1.2 Операторы if-else. 3

1.3 Условный оператор ?: 5

1.4 Оператор switch. 5

2 Операторы цикла. 7

2.1 Циклы for 8

2.2 Циклы while. 10

2.3 Циклы do-while. 12

2.4 Оператор break. 13

2.5 Оператор continue. 14

2.6 Оператор goto и метки. 15