Можно ли использовать оператор go to в модульном программах

Оператор безусловного перехода (go to) означает «перейти к» и применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой оператор.

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

При использовании оператора go to необходимо помнить, что областью действия метки является только тот блок, в котором она описана. Передача управления в другой блок запрещена.

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

• следует стремиться применять операторы перехода (если кажется невозможным обойтись без них) для передачи управления только вниз (вперед) по тексту программы; при необходимости передачи управления назад следует использовать операторы цикла;

Метки, оператор goto и оператор switch в Си

• расстояние между меткой и оператором перехода на нее не должно превышать одной страницы текста (или высоты экрана дисплея).

Пример применения оператора безусловного перехода:

Порядок выполнения работы

1. Изучить теоретические сведения по теме: “Написание программы на Паскале с использованием операторов присваивания и безусловного перехода ”.

2. Получить индивидуальное задание у преподавателя и разработать программу в соответствии с поставленной задачей.

3. Показать работающую программу преподавателю.

4. Ответить на контрольные вопросы.

Контрольные вопросы

1. Основные элементы программирования.

2. Основные характеристики программы. Понятия языка, оверлеев, глобальных и локальных блоков.

3. Операторы языка программирования Паскаль. Оператор присваивания. Формат, примеры.

4. Оператор безусловного перехода. Формат, примеры. Основные правила использования

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

Оператор goto (C++)

Оператор goto безоговорочно передает управление оператору, помеченной указанным идентификатором.

Синтаксис

goto identifier;

Remarks

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

Метка оператора имеет смысл только для goto оператора; в противном случае метки операторов игнорируются. Повторное объявление меток невозможно.

Оператор перехода goto. Когда код становится непонятен даже создателю. Урок #22.

Оператор goto не может передавать управление в расположение, которое пропускает инициализацию любой переменной, которая находится в область в этом расположении. Следующий пример вызывает ошибку C2362:

int goto_fn(bool b) < if (!b) < goto exit; // C2362 >else < /*. */ >int error_code = 42; exit: return error_code; >

По возможности рекомендуется использовать break операторы , continue и return вместо goto оператора . Тем не менее, так как break оператор выходит только из одного уровня цикла, может потребоваться использовать goto оператор для выхода из глубоко вложенного цикла.

Дополнительные сведения о метках и инструкции см. в goto разделе Операторы с метками.

Пример

В этом примере оператор передает управление точке, goto помеченной stop как i 3.

// goto_statement.cpp #include int main() < int i, j; for ( i = 0; i < 10; i++ ) < printf_s( «Outer loop executing. i = %dn», i ); for ( j = 0; j < 2; j++ ) < printf_s( » Inner loop executing. j = %dn», j ); if ( i == 3 ) goto stop; >> // This message does not print: printf_s( «Loop exited. i = %dn», i ); stop: printf_s( «Jumped to stop. i = %dn», i ); >
Outer loop executing. i = 0 Inner loop executing. j = 0 Inner loop executing. j = 1 Outer loop executing. i = 1 Inner loop executing. j = 0 Inner loop executing. j = 1 Outer loop executing. i = 2 Inner loop executing. j = 0 Inner loop executing. j = 1 Outer loop executing. i = 3 Inner loop executing. j = 0 Jumped to stop. i = 3

Читайте также:
Программа для контакта чтобы видеть

Источник: learn.microsoft.com

GOTO or not GOTO вот в чём вопрос

«Спор возможен там, где истина закрыта. В бесплодных спорах можно бесконечно обсуждать, что в комнате находится закрытой дверью. Но стоит дверь открыть, и ясно станет всем и спорить не о чем, коль каждый истину увидеть сможет»

Статья посвящается Зацепину П.М., выдающемуся инженеру Алтайского государственного университета, под чьим чутким руководством многие студенты, включая автора статьи, постигали магию инженерного творчества.

Введение

Спор о возможности использования в программах оператора GOTO ведётся уже очень давно (официальным его началом признана статья Дейкстры «О вреде оператора GOTO», опубликованная в 1968 году [2]). Через три года мы будем праздновать 50-летний юбилей этого спора. Это хороший повод, чтобы наконец-то «расставить все точки над i» и прекратить спор.

Цитата в эпиграфе выбрана неслучайно. Она в точности отражает текущую ситуацию в споре про GOTO. В нашем случае «комната за закрытой дверью» – это понятная всем постановка задачи. Пока, к сожалению, такой постановки задачи озвучено не было, поэтому споры и не угасают. Противоборствующие стороны спорят хоть и о схожих, но всё-таки о разных вещах, поэтому и не могут найти компромисса.

Давайте займём в этом споре нейтральную сторону, и беспристрастно во всём разберёмся. Рассмотрим доводы «противников» и «защитников» оператора GOTO и решим, «кто из них прав, а кто виноват».

Почему ведутся споры

Как уже было отмечено выше, споры о возможности использования в программах оператора GOTO ведутся из-за отсутствия понятной всем постановки задачи. Грубо говоря, одна из сторон доказывает, что дерево плавает, а другая, что кирпич тонет. Естественно, что при такой постановке каждая из сторон уверена в своей правоте и будет вечно её отстаивать.

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

Защитники GOTO уповают на требования заказчика, где, среди прочих не редко встречаются пункты, связанные с быстродействием и компактностью программы. При такой постановке одним правилом хорошего тона не обойтись – приходится искать компромиссное решение. В результате такого решения в программе иногда и появляется оператор GOTO.

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

Озвученная точка зрения весьма поверхностна, т.к. не учитывает деталей спора. Чтобы сформулировать объективную постановку задачи, необходимо рассмотреть аргументы и контраргументы каждой из сторон. Этим мы сейчас и займёмся. Жирные буквы З – это аргументы защитников GOTO, а жирные буквы П – это аргументы противников GOTO.

Доводы «противников» GOTO

1. Использование GOTO – плохой тон.
З: Это неаргументированное заявление, поэтому спорить здесь нет смысла.
2. Самый плохой тон – возвращение с помощью метки назад.

З: Действительно, так использовать GOTO нельзя, так же как нельзя его использовать и для перехода в другой блок области видимости – можно или оставаться в текущем, или выходить из него. Если следовать двум этим правилам, то использовать GOTO можно.

3. GOTO – избыточный оператор. Его легко можно заменить циклами и условиями.

З: Если на то пошло, то из языка можно выкинуть практически все операторы.

Читайте также:
С чего программа 1с начинает реформацию баланса

С точки зрения структурного программирования из языка можно вообще выкинуть все операторы, оставив только while и оператор присваивания. [1] В таком случае программы будут хоть и объёмными, но понятными. Если бы на практике внимание уделялось только структуре программы, то такой шаг был бы обоснованным, но в реальных задачах есть ещё требования на быстродействие и компактность, а этого одним оператором добиться невозможно.

GOTO – признак не кривизны кода, а кривизны языков, в которых без него порой никак (C, C++, C#, Pascal, Java, etc) и кривизны профанации под названием «структурное программирование» с его т.н. «циклами с предусловиями», «циклами с постусловиями» и «ветвлениями», которые являются не элементарными конструкциями, а типовыми паттернами, в которые задача не всегда удобно ложится.

Неудобство заключается в том, что если задача не ложится в эти паттерны идеально, то появляется избыточный код, который в некоторых случаях не удовлетворяет требованиям компактности и быстродействия.

4. Вирт и Дейкстра говорят, что GOTO это плохо. [2, 3]

З: Авторитетные мнения достойны внимания, но то, что говорят авторитеты, не есть истина в последней инстанции. Недаром в учёной среде бытует фраза «Если уважаемый учёный говорит, что «это сделать возможно», то он скорее всего прав, а если говорит, что «это сделать невозможно», то скорее всего не прав».

Есть и такие авторитеты, которые высказываются в пользу GOTO, например, Дональд Кнут [4], Фредрик Брукс. [5] Но при решении задачи более целесообразно опираться не на мнение авторитетов, а на здравый смысл.

5. GOTO аннулирует многие возможности компилятора по оптимизации управляющих структур, из-за чего код становится медленней и объёмней. [2]

З: Эта проблема никоим образом не связана с GOTO, т.к. оптимизация производится на уровне машинных кодов. Да, GOTO вставляет в машинный код инструкцию перехода, которая препятствует оптимизации кода, но те же самые инструкции вставляют и условный оператор, и операторы цикла.

Доводы «защитников» GOTO

1. Группа взаимоисключающих условий.
Пример кода.

if(objectA.nValue == objectB.nValue) < . goto END; >if(objectC.nValue == objectD.nValue) < . goto END; >if(objectE.nValue == objectF.nValue) < . goto END; >END: .
if(objectA.nValue == objectB.nValue) < >else if(objectC.nValue == objectD.nValue) < >else if(objectE.nValue == objectF.nValue) < >…

П: В данном случае GOTO структуру программы не портит, но в таком построении нет практической необходимости, т.к. то же самое можно организовать через if/else.

З: Заменить приведённый код на if/else можно только в том случае, если перед завершением не выполняется дополнительных операций.

П: Дополнительные операции можно вынести в отдельную функцию и вызывать её в каждой ветке.

З: Вынос дополнительных операций в отдельную функцию снизит быстродействие программы, а в некоторых случаях это недопустимо.

П: Отдельную функцию можно оформить в виде inline-функции, тогда на быстродействии это никак не скажется.

З: Но тогда программа будет занимать больше памяти. А это тоже в некоторых случаях может противоречить задаче.

В результате этого спора во многих языках были введены процедуры завершения и механизм структурной обработки исключений. Эти инструменты работают немного медленнее GOTO, но более наглядны, поэтому для большинства задач их вполне хватает. Но, опять же, существуют задачи, где критично и это «немного», – в них использование GOTO видится целесообразным.

2. Принцип вселенской причинности – если где-то есть GOTO, значит он там нужен.

Новый язык появляется не с бухты-барахты. Перед разработчиками языков программирования стоит непростая задача – удовлетворить все запросы программистов, и учесть общепринятые парадигмы. Абсурдно предполагать, что в языке будет реализована концепция, которая никому не нужна. Если в качестве примера рассмотреть Си, то вообще все вопросы отпадают, т.к. при анализе языка складывается такое ощущение, что за каждый новый введённый в язык оператор разработчики должны были заплатить из своего кармана по 5000 долларов… а оператор GOTO там есть.

Читайте также:
Лучшая программа для кодирования

3. Выход из множества циклов одновременно.
П: Классический аргумент. Против него не поспоришь.
4.

Конечные автоматы (пример кода).

state_1: switch (signal) < case 1: goto state_5; case 2: goto state_10; case 3: goto state_8; >state_2: switch (signal)
// Достойных реализаций без GOTO не обнаружено.
5. Ещё один пример.

Пример кода.
for (int i=0;i // some code > next2: // some code> next1: // some code >
inline void doSomeActivityInFor() < for(int i=0;i// some code > // some code > inline bool some_condition3(i,j) < for(int k=0;kreturn false; >

П: Приведённый код выполняется с той же скоростью и занимает столько же памяти, что и код с GOTO.

З: Данный пример лишний раз показывает, что нужно более внимательно подходить к разработке алгоритма. Использование GOTO в программах допустимо, но не нужно из одной крайности бросаться в другую.

Подведём итоги

Толпы религиозных фанатиков команды квалифицированных программистов часто отказываются от оператора GOTO, даже когда его использование целесообразно с точки зрения эффективности и наглядности программы.

Плохой тон в программировании? Если учитывать только «тон структурирования», то да. Но ведь ещё есть «тон быстродействия» и «тон компактности», поэтому нужно искать компромисс между ними. [6] Программисты «работающие в песочнице», как правило, решают задачи, в которых не приходится задумываться об экономии ресурсов, отсюда и вытекает недопонимание.

Игнорировать «тон структурирования» тоже нельзя, т.к. программу в любом случае придётся дорабатывать, и если в ней будет запутанная структура, то возникнут ненужные затраты. Как и в любых других практических решениях оптимальным является компромиссный вариант: использование GOTO разрешено, но со следующими оговорками:

  1. Переходить можно только вперёд.
  2. Заходить в блоки категорически нельзя (либо оставаться, либо выходить).

Благодарности

Я благодарен людям, которые поделились со мной информацией и своими мыслями по поводу оправданности использования в программах оператора GOTO. Без вашей помощи статья выражала бы однобокое мнение единственного человека, т.е. меня. Вместе с вами нам удалось поддержать конструктивный спор, в результате которого проявился однозначный ответ на тему, волнующую большое число программистов.

Кто же эти люди? Вот они:

Благодарю Дмитрия Леонова за создание сайта bugtraq.ru и за то, что ему удалось сплотить большое количество высококлассных специалистов на своём форуме. Именно на этом форуме развернулась самая интересная дискуссия. Благодарю людей, принявших участие в дискуссии на этом форуме:

Благодарю OlegY, Heller, Zef за примеры кода, где использование GOTO оправдано.

Благодарю HandleX за философские мысли о нужности GOTO при решении практических, а не теоретических задач.

Благодарю amirul за озвучивание правил применения GOTO.

Благодарю AMMOmium за мысль о «байках-страшилках» для начинающих программистов.

Благодарю команду программистов с форума codenet.ru за показательный пример классического спора, а именно следующих лиц: nilbog, koderAlex, OlgaKr, kerdan, kosfiz3A3-968M, IL84, fanto, Sanila_san, nixus, green, newonder.

PS. Спасибо за внимание. Буду рад комментариям; вопросы и возражения также приветствуются.

Библиография

  1. Р. Лингер, Х. Миллс, Б. Уитт. Теория и практика структурного программирования. – М.: Мир, 1982.-406с.
  2. Edsger W. Dijkstra.Go To Statement Considered Harmful // Communications of the ACM 11, March 1968. 147-148.
  3. Niklaus Wirth. Good Ideas, through the Looking Glass // Computer, V. 39, No 1, January 2006.
  4. Donald E. Knuth.Structured Programming with go to Statements // Computing Surveys, V.6, No.4. December 1974.
  5. Фредерик Брукс. Мифический человеко-месяц или как создаются программные системы.: Пер. с англ. – М.: Символ-Плюс, 2001.-304с.
  6. Карев А.А.Код #кода.
  • психология программирования
  • философия программирования
  • алгоритмы
  • goto существует

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru