5.10. Инструкция goto

5.10. Инструкция 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, не перескакивайте через большой фрагмент кода, чтобы можно было легко найти начало и конец вашего перехода.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.3.2 Goto

Из книги C++ автора Хилл Мюррей

3.3.2 Goto С++ снабжен имеющим дурную репутацию оператором goto.goto идентификатор; идентификатор : операторВ общем, в программировании высокого уровня он имеет очень мало применений, но он может быть очень полезен, когда С++ программа генерируется программой, а не пишется


9.11 Оператор Goto

Из книги Справочное руководство по C++ автора Страустрап Бьярн

9.11 Оператор Goto Можно осуществлять безусловную передачу упраления с пмощью оператораgoto идентификатор ;Идентификатор должен быть меткой (#9.12), расположенной в текущей функции. Невозможно передать управление в обход описания с инициализатором (явным или неявным) никак,


R.6.6.4 Оператор goto

Из книги Практика и проблематика моделирования бизнес-процессов автора Всяких Е И

R.6.6.4 Оператор goto Оператор goto безусловно передает управление на оператор, помеченный идентификатором. Идентификатор должен быть меткой (§R.6.1), находящейся в текущей


5.2.10.1. Инструкция IF

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

5.2.10.1. Инструкция IF IF search_condition THEN statement_list[ELSEIF search_conditionTHEN statement_list] …[ELSE statement_list]END IFIF реализован как базисная условная конструкция. Если выражение search_condition истинно, соответствующий список инструкции SQL выполнен. Если пары search_condition не нашлось, будет выполнен операторный


5.2.10.7. Инструкция WHILE

Из книги Язык Си - руководство для начинающих автора Прата Стивен

5.2.10.7. Инструкция WHILE [begin_label:]WHILE search_condition DO statement_listEND WHILE[end_label]Операторный список внутри инструкции WHILE повторен, пока search_condition равно true. Инструкция WHILE может быть помечена. Пример:CREATE PROCEDURE dowhile()BEGINDECLARE v1 INT DEFAULT 5;WHILE v1 > 0 DO…SET v1 = v1 – 1;END


Оператор перехода goto

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Оператор перехода goto Синтаксис:goto <метка>;...<метка>: <оператор>Действие:Оператор перехода goto передает управление непосредственно на <оператор>, помеченный <меткой>. Метка представляет собой обычный идентификатор, синтаксис которого описан в разделе 1.3.


ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto

Из книги C++ для начинающих автора Липпман Стенли

ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto      Операторы, определяющие циклические вычисления, которые только что обсуждались, и условные операторы (if, if-else, switch) являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для


goto:

Из книги Графология XXI века автора Щеголев Илья Владимирович

goto:      Оператор goto - одно из важнейших средств Бейсика и Фортрана - также реализован и в Си. Однако на этом языке в отличие от двух других можно программировать, совершенно не используя указанное средство. Керниган и Ритчи считают оператор goto "чрезвычайно плохим"


Избегайте использовать goto  

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

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


5.6. Инструкция while

Из книги автора

5.6. Инструкция while Синтаксис инструкции while следующий:while ( условие )инструкцияПока значением условия является true, инструкция выполняется в такой последовательности:* Вычислить условие.* Выполнить инструкцию, если условие истинно.* Если самое первое вычисление условия


4.2. Инструкция по использованию

Из книги автора

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


Оператор безусловного перехода goto

Из книги автора

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