netlib.narod.ru< Назад | Оглавление | Далее >

3.8. Инструкция goto и метки

В Си имеется порицаемая многими инструкция goto и метки для перехода на них. Строго говоря, в этой инструкции нет никакой необходимости, и на практике почти всегда легко без нее обойтись. До сих пор в нашей книге мы не использовали goto.

Однако существуют случаи, в которых goto может пригодиться. Наиболее типична ситуация, когда нужно прервать обработку в некоторой глубоко вложенной структуре и выйти сразу из двух или большего числа вложенных циклов. Инструкция break здесь не поможет, так как она обеспечит выход только из самого внутреннего цикла. В качестве примера рассмотрим следующую конструкцию:

    for (...)
        for (...) {
            ...
            if (disaster)    /* если возникла проблема */
                goto error;  /* уйти по ошибке */
            ...
        }
    ...
error:                       /* обработка ошибки */
    ликвидировать проблему

Такая организация программы удобна, если подпрограмма обработки ошибочной ситуации достаточно сложна и ошибка может встретиться в нескольких местах.

Метка выглядит как обычное имя переменной, за которым следует двоеточие. На метку можно перейти с помощью goto из любого места данной функции, т.е. метка видима для всей функции.

В качестве еще одного примера рассмотрим такую задачу: определить, есть ли в массивах a и b совпадающие элементы. Один из возможных вариантов ее реализации имеет следующий вид:

    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            if (a[i] == b[j])
                goto found;
    /* нет одинаковых элементов */
    ...
found:
    /* обнаружено совпадение: a[i] == b [j] */
    ...

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

    found = 0;
    for (i = 0; i < n && !found; i++)
        for (j = 0; j < m && !found; j++)
            if (a[i] == b[j])
                found = 1;
    if (found)
        /* обнаружено совпадение: a[i-1] == b [j-1] */
        ...
    else
        /* нет одинаковых элементов */
        ...

За исключением редких случаев, подобных только что приведенным, программы с применением goto, как правило, труднее для понимания и сопровождения, чем программы, решающие те же задачи без goto. Хотя мы и не догматики в данном вопросе, все же думается, что к goto следует прибегать крайне редко, если использовать эту инструкцию вообще.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz