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

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

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

1. Работа в ситуации, когда в операторе if требуется выполнить более одного оператора:

if(size > 12)

goto a;

goto b;

a: cost = cost * 1.05;

flag = 2;

b: bill = cost * flag;

(В стандартных Бейсике и Фортране только один оператор, непосредственно следующий за if-условием, считается относящимся к оператору if. Мы выразим это с помощью эквивалентного фрагмента на Си.)

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

if(size > 12);

{

 cost = cost * 1.05;

        flag = 2;

 }

bill = cost * flag;

2. Осуществление выбора из двух вариантов:

if(size > 14) goto a;

sheds = 2;

goto b;

a: sheds = 3;

b: help = 2 * sheds;

Наличие в языке Си структуры if-else позволяет реализовать такой выбор более наглядно:

if(ibex > 14)

        sheds = 3;

else

        sheds = 2;

help = 2 * sheds;

3. Реализация бесконечного цикла:

readin: scanf(" %d", &score);

if(score < 0) goto stagc2;

большое количество операторов;

goto readin:

stagc2: дополнительная чепуха;

}

Эквивалентный фрагмент, в котором используется цикл while, выглядит так:

scanf(" %d", &score);

whilet(score >= 0)

{

 большое количество операторов;

  scanf("%d", &score);

}

дополнительная чепуха;

4. Пропуск операторов до конца тела цикла: используйте оператор continue.

5. Выход из цикла: используйте оператор break. Фактически break и continue являются специальными формами оператора goto. Преимущество их использования заключается в том, что, во-первых, названия этих операторов говорят об осуществляемых ими функциях, а во-вторых, поскольку они нe используют меток, отсутствует опасность пометить не тот оператор программы.

6. Выполнение переходов к различным частям программы непредсказуемым образом: так программировать нельзя!

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

while(funct > 0)

{

 for(i = 1; i < 100; i++)

        {  for(j = 1; j<= 50; j++)

               { большое число операторов;

                 if(большая ошибка)

            goto help;

          операторы;

  }

          еще некоторое количество операторов;  }

   и еще некоторое количество операторов;  }

и еще операторы;

help: устранение ошибки;

Как вы можете заметить из наших примеров, альтернативные формы представления программ более понятны, чем формы, использующие оператор goto. Эти различия станут еще большими, если вы объедините некоторые из рассмотренных случаев. Какие операторы goto используются при реализации операторов if, какие моделируют конструкции if-else, какие управляют работой циклов, а какие появляются лишь потому, что пользователь написал программу так, что не может без них обойтись? Чрезмерное увеличение оператором goto приводит к созданию лабиринта в логике программы. Дадим вам совет: если вы совсем не знакомы с оператором goto, то не применяйте его вовсе; если вы привыкли пользоваться им, попытайтесь отучить себя от этого. Ирония заключается в том, что в языке Си, который вовсе не нуждается в операторе goto, его структура оказывается лучшей, чем в большинстве других языков программирования поскольку в качестве меток можно использовать смысловые имена, а не числа.

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

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

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

3.3.2 Goto

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

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


9.11 Оператор Goto

Из книги Getting Real (на русском) [вычитывается] автора 37signals

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


Избегайте настроек

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

Избегайте настроек Примите решение о деталяхВы сталкиваетесь с ограничением: сколько сообщений должно быть на странице? Ваша первая мысль сделать выбор 25, 50 или 100. Это легкий выход. Просто примите решение, как сделать лучше. И выберите одно число.Настройки — уход от пути


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

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей

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


16. Избегайте макросов

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

16. Избегайте макросов РезюмеМакрос — самый неприятный инструмент С и С++, оборотень, скрывающийся под личиной функции, кот, гуляющий сам по себе и не обращающий никакого внимания на границы ваших областей видимости. Берегитесь его!ОбсуждениеТрудно найти язык, достаточно


17. Избегайте магических чисел

Из книги Удвоение продаж в интернет-магазине автора Парабеллум Андрей Алексеевич

17. Избегайте магических чисел РезюмеИзбегайте использования в коде литеральных констант наподобие 42 или 3.1415926. Такие константы не самоочевидны и усложняют сопровождение кода, поскольку вносят в него трудноопределимый вид дублирования. Используйте вместо них


30. Избегайте перегрузки && , || и , (запятой)

Из книги Linux программирование в примерах автора Роббинс Арнольд

30. Избегайте перегрузки &&, || и , (запятой) РезюмеМудрость — это знание того, когда надо воздержаться. Встроенные операторы &&, || и , (запятая) трактуются компилятором специальным образом. После перегрузки они становятся обычными функциями с весьма отличной


75. Избегайте спецификаций исключений

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

75. Избегайте спецификаций исключений РезюмеНе пишите спецификаций исключений у ваших функций, если только вас не заставляют это делать внешние обстоятельства (например, код, который вы не можете изменить, уже ввел их; см. исключения к данному разделу).ОбсуждениеЕсли


92. Избегайте reinterpret_cast

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

92. Избегайте reinterpret_cast РезюмеКак гласит римская пословица, у лжи короткие ноги. Не пытайтесь использовать reinterpret_cast, чтобы заставить компилятор рассматривать биты объекта одного типа как биты объекта другого типа. Такое действие противоречит безопасности


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

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

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


Избегайте повторного ввода данных

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

Избегайте повторного ввода данных Если пользователь уже сообщил вам что-то о себе (например, имя), лучше запомнить эту информацию и не спрашивать ее повторно, например при последующей регистрации.Лучше самим заботливо вписать имя в соответствующее поле. Людей раздражает,


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

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

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


goto:

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

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


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

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

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


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

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

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