основыкнигиwin/dos*nixготовоелирикагостиФОРУМПОИСК
Б.В. Керниган, Д.М. Ричи -- Язык C

3.9. Оператор GOTO и метки

      В языке "C" предусмотрен и оператор GOTO, которым бесконечно злоупотребляют, и метки для ветвления. С формальной точки зрения оператор GOTO никогда не является необходимым, и на практике почти всегда можно обойтись без него. Мы не использовали GOTO в этой книге.
      Тем не менее, мы укажем несколько ситуаций, где оператор GOTO может найти свое место. Наиболее характерным является его использование тогда, когда нужно прервать выполнение в некоторой глубоко вложенной структуре, например, выйти сразу из двух циклов. Здесь нельзя непосредственно использовать оператор BREAK, так как он прерывает только самый внутренний цикл. Поэтому:

   FOR ( ... )
      FOR ( ... )    {
              ...
              IF (DISASTER)
       GOTO ERROR;
      }
   ...
 
 ERROR:
    CLEAN UP THE MESS

Если программа обработки ошибок нетривиальна и ошибки могут возникать в нескольких местах, то такая организация оказывается удобной. Метка имеет такую же форму, что и имя переменной, и за ней всегда следует двоеточие. Метка может быть приписана к любому оператору той же функции, в которой находится оператор GOTO.
      В качестве другого примера рассмотрим задачу нахождения первого отрицательного элемента в двумерном массиве. (Многомерные массивы рассматриваются в главе 5). Вот одна из возможностей:

   FOR (I = 0; I < N; I++)
      FOR (J = 0; J < M; J++)
              IF (V[I][J] < 0)
       GOTO FOUND;
      /* DIDN'T FIND */
   ...
 FOUND:
   /* FOUND ONE AT POSITION I, J */
   ...

      Программа, использующая оператор GOTO, всегда может быть написана без него, хотя, возможно, за счет повторения некоторых проверок и введения дополнительных переменных. Например, программа поиска в массиве примет вид:

 FOUND = 0;
 FOR (I = 0; I < N && !FOUND; I++)
    FOR (J = 0; J < M && !FOUND; J++)
            FOUND = V[I][J] < 0;
 IF (FOUND)
    /* IT WAS AT I-1, J-1 */
    ...
 ELSE
    /* NOT FOUND */
    ...

      Хотя мы не являемся в этом вопросе догматиками, нам все же кажется, что если и нужно использовать оператор GOTO, то весьма умеренно.

ПРЕДЫДУЩАЯ ЧАСТЬ
3.8. Оператор CONTINUE
СОДЕРЖАНИЕ СЛЕДУЮЩАЯ ЧАСТЬ
4. Функции и структура программ