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