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

  Юрий  | 

  Обновл. 15 Сен 2020  | 

 24348

 ǀ   11 

При запуске программы, центральный процессор (сокр. «ЦП») начинает выполнение кода с первой строки функции 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;

   цикл foreach (добавили в C++11).

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

Исключения


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

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

Заключение

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

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

Погнали!


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

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

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

  1. Аватар Ахмадиёр:

    Юрий спасибо вам огромное этот сайт ,эти уроки мне очень помогают спасибо огромное

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

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

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

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

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

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

    1. Юрий Юрий:

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

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

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

    1. Юрий Юрий:

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

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

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

        1. Юрий Юрий:

          Пожалуйста 🙂

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

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

    1. Юрий Юрий:

      Пожалуйста 🙂

  6. Аватар Sasha:

    Еще уроки!!

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

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