Управляющие конструкции языка Си. Представление программ в виде функций. Работа с памятью. Структуры
Выход из цикла break, переход на конец цикла continue
Если необходимо прервать выполнение цикла, следует использовать оператор
break;
Оператор break применяется внутри тела цикла, заключенного в фигурные скобки. Пример: требуется найти корень целочисленной функции f(x), определенной для целочисленных аргументов.
int f(int x); // Описание прототипа функции . . . int x; . . . // Ищем корень функции f(x) x = 0; while (true) { if (f(x) == 0) { break; // Нашли корень } // Переходим к следующему целому значению x // в порядке 0, -1, 1, -2, 2, -3, 3, ... if (x >= 0) { x = (-x - 1); } else { x = (-x); } } // Утверждение: f(x) == 0
Здесь используется бесконечный цикл " while (true) ". Выход из цикла осуществляется с помощью оператора " break ".
Иногда требуется пропустить выполнение тела цикла при каких-либо значениях изменяющихся в цикле переменных, переходя к следующему набору значений и очередной итерации. Для этого используется оператор
continue;
Оператор continue, так же, как и break, используется лишь в том случае, когда тело цикла состоит более чем из одного оператора и заключено в фигурные скобки. Его следует понимать как переход на фигурную скобку, закрывающую тело цикла. Пример: пусть задана n+1 точка на вещественной прямой xi, i = 0, 1,..., n ; точки xi будут называться узлами интерполяции. Элементарный интерполяционный многочлен Лагранжа Lk(x) - это многочлен степени n, который принимает нулевые значения во всех узлах xi, кроме xk. В k -ом узле xk многочлен Lk(x) принимает значение 1. Многочлен Lk(x) вычисляется по следующей формуле:
Пусть требуется вычислить значение элементарного интерполяционного многочлена Lk(x) в заданной точке x = t. Это делается с помощью следующего фрагмента программы:
double x[100]; // Узлы интерполяции (не более 100) int n; // Количество узлов интерполяции int k; // Номер узла double t; // Точка, в которой вычисляется значение double L; // Значение многочлена L_k(x) в точке t int i; . . . L = 1.0; // Начальное значение произведения i = 0; while (i <= n) { if (i == k) { ++i; // К следующему узлу continue; // Пропустить k-й множитель } // Вычисляем произведение L *= (t - x[i]) / (x[k] - x[i]); ++i; // К следующему узлу } // Ответ в переменной L
Здесь оператор continue используется для того, чтобы пропустить вычисление произведения при i = k.
Оператор перехода на метку goto
Оператор перехода goto позволяет изменить естественный порядок выполнения программы и осуществить переход на другой участок программы, обозначенный меткой. Переход может осуществляться только внутри функции, т.е. оператор goto не может ни выйти из функции, ни войти внутрь другой функции. Оператор goto выглядит следующим образом:
L: ...; . . . goto L;
В качестве метки можно использовать любое имя, допустимое в Си (т.е. последовательность букв, цифр и знаков подчеркивания " _ ", начинающуюся не с цифры). Метка может стоять до или после оператора goto. Метка выделяется символом двоеточия " :". Лучше после него сразу ставить точку с запятой " ; ", помечая таким образом пустой оператор - это общепринятая программистская практика, согласно которой метки ставятся между операторами, а не на операторах.
Не следует увлекаться использованием оператора goto - это всегда запутывает программу. Большинство программистов считают применение оператора goto дурным стилем программирования. Вместо goto при необходимости можно использовать операторы выхода из цикла break и пропуска итерации цикла continue (см. раздел 3.5.7). Единственная ситуация, в которой использование goto оправдано, - это выход из нескольких вложенных друг в друга циклов:
while (...) { . . . while (...) { . . . if (...) { goto LExit; // Выход из двух // вложенных циклов } . . . } } LExit: ;
- В объектно-ориентированном языке Java, синтаксис которого построен на основе языка Си, использование оператора goto запрещено. Вместо него для выхода из нескольких вложенных друг в друга циклов применяется форма оператора break с меткой. Меткой помечается цикл, из которого надо выйти:
Loop1: while (...) { . . . while (...) { . . . break Loop1; // Выход из цикла, // помеченного меткой Loop1 . . . } . . . }