Урок №63. Операторы управления потоком выполнения программ

  Юрий  | 

    | 

  Обновл. 25 Апр 2019  | 

 11174

 ǀ   10 

При запуске программы, центральный процессор (ЦП) начинает выполнение кода с первой строчки функции main(), выполняя определённое количество стейтментов, а затем завершает выполнение при завершении блока main(). Последовательность стейтментов, которые выполняет ЦП, называется порядком выполнения программы (или ещё «потоком выполнения программы»).

Порядок выполнения программ

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

Но на практике это не всегда может быть то, что нам нужно. Например, если мы попросим пользователя сделать выбор между + и /, а пользователь введёт некорректный символ (например, *), то, в идеале, нам нужно было бы попросить его ввести символ ещё раз. Но это невозможно в линейной программе. Кроме того, бывают случаи, когда нужно выполнить что-то несколько раз, но количество этих повторений наперёд неизвестно. Например, если бы мы хотели вывести все целые числа от 0 до числа, которое введёт пользователь, то, в линейной программе, мы бы не смогли это сделать, не зная наперёд число, которое введёт пользователь.

К счастью, в C++ есть операторы управления порядком выполнения программы, которые позволяют программисту изменить поток выполнения программы центральным процессором.

Остановка


Самый простой оператор управления порядком выполнения программы — это остановка, которая сообщает программе немедленно прекратить своё выполнение. В C++ остановка осуществляется с помощью функции exit(), которая определена в заголовочном файле cstdlib. Функция exit() принимает целочисленный параметр, который затем возвращает обратно в операционную систему в качестве кода выхода. Например:

Прыжок

Следующим оператором управления порядком выполнения программы является прыжок (или ещё «переход»). Он безоговорочно сообщает компилятору во время выполнения перейти от одного стейтмента к другому, т.е. выполнить прыжок. Ключевые слова goto, break и continue являются разными типами прыжков, об их различиях мы поговорим несколько позже.

Вызовы функций — это тоже, в некоторой степени, прыжки. При выполнении вызова функции, ЦП переходит к началу вызываемой функции. Когда вызываемая функция заканчивается, выполнение возвращается к следующему стейтменту, который находится после вызова этой функции.

Условные ветвления


Условное ветвление заставляет программу изменить свой порядок выполнения, основываясь на значении результата выражения. Одним из основных операторов условного ветвления является if, который вы уже могли видеть в программах раньше. Например:

Здесь есть два возможных пути выполнения программы. Если результатом выражения будет true, то программа выполнит A, B и D. Если же результатом выражения будет false, то программа выполнит A, C и D. То есть выполниться либо B, либо С, оба варианта выполняться вместе не будут. Это уже не линейная программа.

Ключевое слово switch также предоставляет механизм для выполнения условного ветвления. Более подробно об операторах if и switch мы поговорим в соответствующих уроках.

Циклы

Цикл заставляет программу многократно выполнять определённое количество стейтментов до тех пор, пока определённое условие не станет ложным. Например:

Эта программа может выполняться как ABC, ABBC, ABBBC, ABBBBC или даже AC. Опять же, она больше не является линейной, её порядок выполнения зависит от того, сколько раз выполнится цикл (если вообще выполнится).

В C++ есть 4 типа циклов:

   while;

   do while;

   for;

   for each (добавили в C++11).

Мы подробно рассмотрим каждый из них в этой главе, кроме for each, о нём немного позже.

Исключения


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

Обработка исключений — это довольно сложная тема и это единственный тип оператора управления порядком выполнения, который мы не будем рассматривать в этой главе. Исключения обсудим в главе №14.

Заключение

Используя операторы управления порядком выполнения программы, вы можете повлиять на поток выполнения программы центральным процессором, а также на то, из-за чего он может быть прерван. До этого момента функционал наших программ был очень ограничен. Теперь же, с операторами управления порядком выполнения программ, мы сможем осуществить огромное количество разных интересных вещей, например: отображение меню до тех пор, пока пользователь не сделает правильный выбор; вывод каждого числа между x и y и много-много чего ещё.

Как только вы разберётесь с этой темой, вы перейдёте на новый, более качественный, уровень. Больше вы не будете ограничены игрушечными программами или простенькими упражнениями — вы сможете писать полноценные программы. Вот именно здесь и начинается всё самое интересное. Погнали!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (130 оценок, среднее: 4,95 из 5)
Загрузка...

Комментариев: 10

  1. Аватар Алексей:

    Юрий, елки-палки, как я этого ждал.

    Я пусть большее время писал скрипты на bash, но без for || while просто не обходиться ничего.

    Тут пойдет веселье. Тяжкое, сложное, но веселье.

  2. Аватар Николай:

    Огромное спасибо человеку, который сделал перевод этого прекрасного учебника! Чувак, скинь данные — я перечислю тебе деньги,
    ты невереятно крутой!)))))) На англ версии еще куча глав, будешь ли заниматься их переводом?

    1. Юрий Юрий:

      Привет, реально приятно читать такие отзывы, спасибо 🙂 Да, постараюсь перевести все уроки/главы до конца.

  3. Аватар Человек:

    Еще один вопрос: можно ли вместо exit(0) использовать return 0? Или с функцией main такой прием не работает?

    1. Юрий Юрий:

      Функция exit() используется для возврата кода ошибки обратно в операционную систему и немедленного завершения выполнения программы (детальнее здесь). Использовать exit(0) в вместо return-а в некоторых случаях можно, но нужно понимать, для чего используется return, а для чего exit. Зачем использовать вилку, если есть ложка — это аналогия вашего вопроса. Делать можете, что хотите, но есть неписанные правила, и лично я, еще нигде ни разу не видел, чтобы в main-е использовали exit вместо return-а.

      1. Аватар Человек:

        И снова спасибо)

        1. Юрий Юрий:

          Пожалуйста 🙂

  4. Аватар Александр:

    Самый лучший учебник, который пока я встречал. Спасибо

    1. Юрий Юрий:

      Пожалуйста 🙂

  5. Аватар Sasha:

    Еще уроки!!

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *