Оператор continue
Так же, как и ключевое слово break, оператор continue прерывает выполнение тела цикла, но в отличие от первого, он предписывает программе перейти на следующую итерацию цикла.
В качестве примера использования оператора continue предлагается программа нахождения простых чисел (делящихся на 1 и на самих себя).
#include <iostream.h>
int main ()
{
bool dev = false;
for(int i=2; i<50; i++)
{
for(int j=2; j<i; j++)
{
if (±%J)
continue; else
{
dev = true; break;
}
}
if(!dev)
cout « i « " ";
dev = false;
}
return 0;
}
Программа организована в виде двух вложенных циклов таким образом, что осуществляется перебор и проверка остатка от деления пары чисел, первое из которых изменяется от 2 до 50, а второе - от 2 до значения первого числа. Если остаток от деления ненулевой, осуществляется продолжение внутреннего цикла по оператору continue. В случае, если остаток от деления составил 0, выполняется выход из внутреннего цикла с установкой признака деления в логической переменной dev. По окончании внутреннего цикла производится анализ логической переменной dev и вывод простого числа.
Оператор goto и метки
Метка представляет собой идентификатор с расположенным за ним символом двоеточия (:).
Метками помечают какой-либо оператор, на который в дальнейшем должен быть осуществлен безусловный переход.
Безусловная передача управления на метку производится при помощи оператора goto.
Оператор goto может осуществлять переход (адресоваться) к меткам, обязательно расположенным в одном с ним теле функции.
Синтаксис оператора goto: goto метка;
Данный оператор - очень мощное и небезопасное средство управления поведением программы. Использовать его нужно крайне осторожно, так как, например, "прыжок" внутрь цикла (обход кодов инициализации) может привести к трудно локализуемым ошибкам.
Рассмотрим пример применения оператора goto.
#include <iostream.h>
int main ()
{
// Инициализация переменных
if (...)
{
// Если условие выполнено, производим
// какие-то действия и переходим
// к оператору по метке label
goto label;
}
...
label:
...
return 0;
}
Как только выполнение программы достигнет оператора goto, управление будет передано оператору, следующему за меткой label.
Вообще говоря, использование структурного и объектно-ориентированного подходов к программированию позволяет полностью отказаться от применения операторов безусловного перехода. Однако на практике часто бывают случаи, когда goto значительно упрощает код программы. В особенной степени это утверждение касается вложенных конструкций switch-case и if-else.
В качестве примера вернемся к модели светофора, дополнив ее соответствующим образом:
#include <iostream.h>
int 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 labl;
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;
return 0;
}
В приведенной программе объявляются три переменные для хранения информации о текущем (current), предыдущем (previous) и следующем (next) состоянии светофора. В операторе switch производится анализ текущего состояния и на основании полученного результата осуществляется вывод соответствующего сообщения. В случае сбоя работы светофора (рассчитанные значения переменных next и previous не совпадают с реальными данными), осуществляется переход к метке lаb1 с последующим переводом светофора в режим "Неуправляемый перекресток". После проверки выполнение программы продолжается с метки start.