С++ для начинающих

       

Инструкция goto


Инструкция goto обеспечивает безусловный переход к другой инструкции внутри той же функции, поэтому современная практика программирования выступает против ее применения.

Синтаксис goto следующий:

goto метка;

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

end: ; // пустая инструкция

}

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

int oops_in_error() {

    // mumble ...

    goto end;

    // ошибка: переход через объявление

    int ix = 10;

    // ... код, использующий ix



end: ;

}

Правильная реализация функции помещает объявление ix и использующие его инструкции во вложенный блок:

int oops_in_error() {

    // mumble ...

    goto end;

    {

        // правильно: объявление во вложенном блоке

        int ix = 10;

        // ... код, использующий ix

    }

end: ;

}

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

Переход назад через объявление, однако, не считается ошибкой. Почему? Перепрыгнуть через инициализацию объекта нельзя, но проинициализировать один и тот же объект несколько раз вполне допустимо, хотя это может привести к снижению эффективности. Например:

// переход назад через объявление не считается ошибкой.

void

mumble ( int max_size )

{

  begin:

    int sz = get_size();

    if ( sz <= 0 ) {

        // выдать предупреждение ...

        goto end;

    }

    else

    if ( sz > max_size )

        // получить новое значение sz

        goto begin;

    {   // правильно: переход через целый блок

        int ia = new int[ sz ];

        doit( ia, sz ) ;

        delete [] ia;

    }

  end:

    ;

}

Использование инструкции goto резко критикуется во всех современных языках программирования. Ее применение приводит к тому, что ход выполнения программы становится трудно понять и,  следовательно, такую программу трудно модифицировать. В большинстве случаев goto можно заменить на инструкции if или циклы. Если вы все-таки решили использовать goto, не перескакивайте через большой фрагмент кода, чтобы можно было легко найти начало и конец вашего перехода.



Содержание раздела