Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Операторы передачи управления




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

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

- оператор выхода из цикла break;

- оператор перехода к следующей итерации цикла continue;

- оператор возврата из функции return.

 

Оператор goto

Использование оператора goto всегда вызывало много споров.

Так, один из основоположников теоретического программирования Э. Дейкстра заметил, что качество программного кода обратно пропорционально количеству операторов goto в нем. Считается, что этот оператор затрудняет понимание программ, а также их модификацию.

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

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

- обработка ошибок;

- переход из нескольких мест функции в одно (например, если перед выходом из функции необходимо всегда выполнять какие-либо действия).

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

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

- не следует использовать goto для перехода внутрь структурных операторов, таких, как операторы цикла, условный оператор, оператор выбора,

- никогда не обходите инициализацию переменных, где бы она не использовалась.

Игнорирование этих рекомендаций может привести к трудно обнаруживаемым ошибкам.

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

goto метка;

В теле той же функции должна присутствовать ровно одна конструкция вида:

метка: оператор;

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

Пример 7. Не соблюдается правило не обходить инициализацию переменных.

int k;

goto metka;

{int a=3, b=4;

k=a+b;]

metka: int m=k+1;

}

После выполнения этого фрагмента программы значение переменной m не определено.

 

Оператор break

Оператор break используется для прерывания текущего оператора, после его выполнения управление передается оператору, следующему за прерванным. Оператор break может быть использован только внутри операторов:

switch, for, while или do while.

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

Пример 8. Ввести с клавиатуры х и у, суммировать числа начиная от х с шагом у пока сумма меньше К, подсчитать количество итераций. Повторять процессы ввода х, у, и суммирования, пока х находится в диапазоне от А до В.

# define A 10              //задаются именованные константы

# define B 1000

# define K 9999

//выделяется память под переменные

int x, y, i, sum;

do

{

printf (“\n Vvod x, y”); \\Приглашение для ввода данных

// ввод данных с клавиатуры в переменные х и у

scanf (“%d%d”, &x, &y);

for (i=x; sum=0; i=i+y)

{   sum+=i;

       if (sum > K) {break; break}   

}

// цикл продолжается, если х – в диапазоне от А до В

while (x>A && x<B)

При выполнении условия sum > K завершится выполнение только внутреннего цикла for, а выполнение внешнего цикла do-while продолжится, несмотря на то, что оператор break повторен дважды. Для выхода из вложенных циклов используйте оператор goto.

 

Оператор continue

Оператор continue служит для изменения естественного хода программы при работе циклических структур, он используется только внутри операторов цикла: for, while или do-while. Оператор continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации. Обычно этот оператор входит в одну из ветвей оператора if. Формат оператора:

continue;

Пример 9. Программа обрабатывает только четные суммы, пропуская остальные.

void main()

{

int i, a, sum;

for (i=1, sum=0; a<100; a++)

{

    printf (“a =”);

scanf(“%d”,&a);

sum+=a;

    if (sum%2 != 0) continue;

// обработка четных сумм

printf(“iteratia %d: \t summa=%d \n”, i, sum);

}

}

Когда sum – нечетное, выражение sum%2 получает значение 1 и выполняется оператор continue, который передает управление на следующую итерацию цикла for, тем самым пропуская программу обработки четных сумм.

 

Оператор return

Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию в точку, непосредственно следующую за вызовом.

Оператор return в функции main() прерывает выполнение программы и передает управление операционной системе.

Формат оператора:

return [выражение];

Значение выражения, если оно задано, возвращается в вызывающую программу в качестве результата выполнения функции. Если выражение опущено, то возвращаемое значение не определено. Выражение может быть заключено в ( ), хотя их наличие не обязательно. Если в какой-либо функции отсутствует return, то передача управления в вызывающую программу происходит после выполнения последнего оператора функции, при этом возвращаемое значение не определено. Если функция не должна иметь возвращаемого значения, то ее нужно объявлять с типом void.

Таким образом, использование оператора return необходимо для немедленного выхода из функции и передачи возвращаемого значения.










Последнее изменение этой страницы: 2018-05-10; просмотров: 161.

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