Метка представляет собой идентификатор с расположенным за ним символом двоеточия (:).
Метками помечают какой-либо оператор, на который в дальнейшем должен быть осуществлен безусловный переход.
Безусловная передача управления на метку производится при помощи оператора 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.