Основы программирования на С++ для начинающих

Оператор switch в C++

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++, основы программированияВ этой статье мы немного изменим формат изучения темы. В начале рассмотрим пример с оператором switch (свич), в котором будет много комментариев о том, что происходит в коде. А вся теория будет располагаться ниже.

Работу оператора множественного выбора switch в C++ мы рассмотрим в решении такой задачи: Допустим, у пользователя есть нумерованный список станций метро Барселоны. Необходимо написать код, в котором будет реализован диалог с пользователем, а именно предложено ввести номер станции метро. После ввода номера станции, надо показать на экран её название и время в пути. Если же станции с таким номером нет, сообщить об этом и предложить ввести номер снова. Приступим:

До строки 13 – всё понятно: объявление необходимых переменных, вывод вопроса на экран, и вход в цикл do while. В строке 14 мы получили значение  answer, которое ввёл пользователь. Далее смотрите, как интересно работает switch() : в круглых скобках передаём ему answer (строка 16) и возле каждого слова  case  записываем возможные значения answer, которые может   ввести пользователь (1, 2, 3 …).

После каждого case  вы видите оператор : , он обязателен. За ним следуют команды, которые должны быть выполнены, если значение case  совпадет со значением answer. Оператор break  в конце каждого блока case  так же является обязательным. Он показывает компилятору, что если этот case был выполнен, то надо выйти из switch().  То есть фактически, когда выполняется switch () начинается перебор и поиск необходимого case.

Если  answer  равно 1, сработает case 1 и на экран будет показано то, что в нем прописано до ключевого слова  break, а все остальные case, будут проигнорированы. Если answer  равно 2 – выполнится только case 2 и произойдет выход из switch(). А что если ни одно значение блоков case не совпадет, с тем значением, что принял switch() (в нашем случае answer)? Для этого предусмотрен блок  default. До него доходит дело, как раз тогда, когда ни один case не отработал и, соответственно, не отработал ни один  break  этих блоков.

В нашем примере, он сработает если значение, которое введет пользователь, будет <1 или >5. Тогда пользователь увидит на экране сообщение о том, что станции метро с таким номером нет и необходимо повторить ввод.

В цикле, мы постоянно проверяем значение answer, которое введено пользователем. Делаем это с помощью if . Если значение находится в рамках подходящего нам диапазона (от 1 до 5 ), то управляющей переменной var будет присвоено  значение 0. В этом случае, пользователю больше не будет предложено ввести новое значение.

Вот как работает эта программа:

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++

 Что следует запомнить:

  • синтаксис:

оператор switch, switch c++, switch в с++, оператор множественного выбора, свич с++

    • блок  default  можно расположить в любом месте блока switch()  Например между первым и вторым case . Его код в любом случае выполнится только тогда, если не найдется нужного значения в  блоках case. Но, советую вам располагать его именно в конце, как делают большинство программистов. Это такое негласное правило.
    • в нижнем блоке switch(), будь то  default или case, оператор break   можно не указывать. Так сделано в нашем примере. Но следует помнить, что во всех остальных break обязателен!
    • default  не является обязательным. Его в switch()  может и не быть вовсе. В таком случае, если ни одно значение блоков case  не совпадет с тем, что принял switch() , программа просто перейдет на следующую строку кода, расположенную под switch()
  • иногда блоки case  проверяют символьные, а не числовые значения. Тогда эти символы необходимо брать в одинарные кавычки –  case ‘b’: ,  case ‘G’: ,  case ‘+’ и т.д.

У кого есть желание – посмотрите видео-урок по теме.

Остались вопросы – задавайте их в комментариях. Обязательно всем отвечу.   Изучайте основы программирования вместе с нами! Больше примеров с использованием  switch  в C++ рассмотрено в статье Задачи:  Оператор switch в C++.

48 thoughts on “Оператор switch в C++

  1. Не работает моя программа, хотя все делаю по Вашей статье. Наверное в свиче нельзя переменные объявлять. Почему и закреплено ли это стандартном?

    1. Владимир, но в нашей программе не объявляются переменные в теле switch. Они объявлены в начале главной функции и ввод значения с клавиатуры находится до switch
      А так переменную создать можно, НО ВОПРОС, зачем она нужна, если ее область видимости закончится при выходе из тела switch. И еще один важный момент – создать ее получится только под самым нижним блоком case или default (так как нарушать синтаксис нельзя) и только в том случае, если он (этот нижний блок) не будет содержать break.

      1. всё равно не вижу смысла объявлять в свитче переменные, пробовал, перед дефолтом работает, но смысла не вижу… не могу понять техническое применение, а посему эту идею считаю бесполезной! переменная всё же должна объявляться до оператора свитч!

  2. Попробуйте ввести число, выходящее за пределы integer.
    Как от этого избавиться?

      1. Да, даже если скопипастить код и ввести #станции ‘111111111’ или любое другое значение, превышающее int – программа будет бесконечно выводить Станции под номером … нет!
        Сделайте правильный выбор (от 1 до 5)

  3. А ещё после логин у Вас через ВК аватарке всех пользователей отображаются, как моя. Надеюсь это только я так вижу)

  4. Избавиться например так:

    do{
    cin >> answer; // ввод значения
    cin.clear();

    ... Тут остальной код

    } while (var); //цикл повторится, пока var не изменит значение на false
    system("pause");

    Фишка в том, что нужно очищать входной буффер, если уж такие переполнения допускаются.

    1. с цифрами это работает, а как быть с буквами или символами? дабы исключить случайное нажатие. а то тоже выводит бесконечно станции под номером … нет и т.д.

      1. Замени
        cin >> answer; // ввод значения
        На
        do
        {
        cout < < "Введите номер станции метро, для расчета времени в пути (от 1 до 5): "; cin.clear(); cin.sync(); cin >> answer;
        } while (cin.fail());

    1. Оператор break в альтернативе (ветке) switch используется практически всегда. В языках C/C++ оператор switch “проходной”: после отработки требуемой альтернативы, без выхода break, начнёт отрабатываться следующая, потом следующая и т.д.

      В некоторых языках (Go, например) оператор switch “не проходной”, и там выход из альтернативы (ветки switch) происходит без break.

      А на вопрос “с каких это пор?” ответ однозначный: “всегда“.

      1. Ответ однозначный – никогда break не был обязательным ни в С, ни в С++.
        Насчет “практически всегда”… Скажем, нужно мне обработать y/n с клавиатуры. Я напишу:
        case “y”:
        case “Y”:
        case “Д”:
        case “д”:
        yes();
        break;
        И то же самое для No. Такое использование является стандартным и довольно частым.

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

      Альтернатива default является стандартной альтернативой оператора switch, её использование считается хорошей практикой.

  5. > Федор Одинцов

    Без break все ветви switch будут выполняться одна за другой, вплоть до последнего default. Это очевидно не то, для чего записывается switch. Поэтому практически всегда каждая ветвь switch должна заканчиваться break.
    В тех редких случаях, когда предполагается выполнить несколько последовательных ветвей, break может не использоваться.

    1. В статье для новичков написано:
      ” Оператор break в конце каждого блока case так же является обязательным.” и “Но следует помнить, что во всех остальных break обязателен!”. Ни о каком “практически всегда” речи нет. У новичка создается впечатление, что break нужен всегда, а не только в рассматриваемом случае. Где в статье написано то, что ты пишешь в своем комментарии?

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

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