Избегайте использовать 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, его структура оказывается лучшей, чем в большинстве других языков программирования поскольку в качестве меток можно использовать смысловые имена, а не числа.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Избегайте повторного ввода данных
Избегайте повторного ввода данных Если пользователь уже сообщил вам что-то о себе (например, имя), лучше запомнить эту информацию и не спрашивать ее повторно, например при последующей регистрации.Лучше самим заботливо вписать имя в соответствующее поле. Людей раздражает,
R.6.6.4 Оператор goto
R.6.6.4 Оператор goto Оператор goto безусловно передает управление на оператор, помеченный идентификатором. Идентификатор должен быть меткой (§R.6.1), находящейся в текущей
16. Избегайте макросов
16. Избегайте макросов РезюмеМакрос — самый неприятный инструмент С и С++, оборотень, скрывающийся под личиной функции, кот, гуляющий сам по себе и не обращающий никакого внимания на границы ваших областей видимости. Берегитесь его!ОбсуждениеТрудно найти язык, достаточно
17. Избегайте магических чисел
17. Избегайте магических чисел РезюмеИзбегайте использования в коде литеральных констант наподобие 42 или 3.1415926. Такие константы не самоочевидны и усложняют сопровождение кода, поскольку вносят в него трудноопределимый вид дублирования. Используйте вместо них
30. Избегайте перегрузки && , || и , (запятой)
30. Избегайте перегрузки &&, || и , (запятой) РезюмеМудрость — это знание того, когда надо воздержаться. Встроенные операторы &&, || и , (запятая) трактуются компилятором специальным образом. После перегрузки они становятся обычными функциями с весьма отличной
75. Избегайте спецификаций исключений
75. Избегайте спецификаций исключений РезюмеНе пишите спецификаций исключений у ваших функций, если только вас не заставляют это делать внешние обстоятельства (например, код, который вы не можете изменить, уже ввел их; см. исключения к данному разделу).ОбсуждениеЕсли
92. Избегайте reinterpret_cast
92. Избегайте reinterpret_cast РезюмеКак гласит римская пословица, у лжи короткие ноги. Не пытайтесь использовать reinterpret_cast, чтобы заставить компилятор рассматривать биты объекта одного типа как биты объекта другого типа. Такое действие противоречит безопасности
ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto
ДРУГИЕ УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ: break, continue, goto Операторы, определяющие циклические вычисления, которые только что обсуждались, и условные операторы (if, if-else, switch) являются важнейшими средствами управления выполнением программы на языке Си. Они должны использоваться для
goto:
goto: Оператор goto - одно из важнейших средств Бейсика и Фортрана - также реализован и в Си. Однако на этом языке в отличие от двух других можно программировать, совершенно не используя указанное средство. Керниган и Ритчи считают оператор goto "чрезвычайно плохим"
Оператор перехода goto
Оператор перехода goto Синтаксис:goto <метка>;...<метка>: <оператор>Действие:Оператор перехода goto передает управление непосредственно на <оператор>, помеченный <меткой>. Метка представляет собой обычный идентификатор, синтаксис которого описан в разделе 1.3.
5.10. Инструкция goto
5.10. Инструкция goto Инструкция goto обеспечивает безусловный переход к другой инструкции внутри той же функции, поэтому современная практика программирования выступает против ее применения.Синтаксис goto следующий:goto метка;где метка – определенный пользователем
Избегайте настроек
Избегайте настроек Примите решение о деталяхВы сталкиваетесь с ограничением: сколько сообщений должно быть на странице? Ваша первая мысль сделать выбор 25, 50 или 100. Это легкий выход. Просто примите решение, как сделать лучше. И выберите одно число.Настройки — уход от пути
3.3.2 Goto
3.3.2 Goto С++ снабжен имеющим дурную репутацию оператором goto.goto идентификатор; идентификатор : операторВ общем, в программировании высокого уровня он имеет очень мало применений, но он может быть очень полезен, когда С++ программа генерируется программой, а не пишется
9.11 Оператор Goto
9.11 Оператор Goto Можно осуществлять безусловную передачу упраления с пмощью оператораgoto идентификатор ;Идентификатор должен быть меткой (#9.12), расположенной в текущей функции. Невозможно передать управление в обход описания с инициализатором (явным или неявным) никак,
Оператор безусловного перехода goto
Оператор безусловного перехода goto Оператор безусловного перехода goto имеет следующую форму: goto метка Он переносит выполнение программы к оператору, помеченному меткой метка.Метка представляет собой идентификатор или целое без знака. Чтобы пометить оператор меткой,