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

Тернарный оператор ? : в C++

Надеюсь, вы хорошо  разобрались с темой операторы выбора if и else и вам не составило большого труда решить задачи по этой теме. В этом же уроке мы продолжаем изучать основы программирования на C++ и познакомимся еще с одним  оператором выбора (ветвления) – это тернарный оператор  ?  :

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

тернарный оператор ?:

Вначале надо  записать необходимое нам условие и за ним поставить знак вопроса ? .  Далее, в этой же строке, после знака вопроса пишем первую простую команду (код), которая будет выполняться, если условие вернет истину (true). После этой команды ставим двоеточие   и пишем вторую команду (код). Эта вторая команда после двоеточия, выполнится только в том случае, если условие возвращает ложь (false).

Пример. Допустим пользователь снимает деньги в банкомате. Он провел эту операцию и на экране должен появиться вопрос: “Вы хотите выполнить другую операцию?”  Пользователю остается сделать выбор (да или нет) и нажать соответствующую кнопку. Организуем этот выбор в следующей программе:

Пользователь делает выбор и вводит значение – строка 13. А в строке 15 мы проверяем введенное значение. Если условие variable == 1 возвращает true (то есть если переменная действительно равна 1), то выполнится код, расположенный после знака вопроса ? . А тот, что находится после двоеточия : – игнорируется. Иначе, если пользователь ввел 0, игнорируется код расположенный между ? и :  , а выполняется второй код.    Вот результат работы если введено 1:

тернарный оператор ?:

если 0:

тернарный оператор ?:

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

Рассмотрим строку 20. Код будет выполняться так – вначале отработает тернарный оператор, вернет значение исходя из поставленного условия, а после это значение запишется в переменную max. Если условие (firstDigit > secondDigit) – истина, значение firstDigit   записывается в max , если ложь, то записывается значение secondDigit.    Далее должно быть всё понятно. Компилируем:

тернарный оператор ?:

Программа работает отлично!

Хорошо о тернарном операторе рассказано в этом видео-уроке.

Напоследок добавлю, что в  некоторых соглашениях о кодировании не рекомендуют использовать тернарный оператор из-за того, что снижается читабельность кода. Но знать о нём надо, так как никто не может предугадать, какие коды придется встретить и читать в будущем.  О соглашениях кодирования больше можно узнать в нашей статье Форматирование исходного кода.

13 thoughts on “Тернарный оператор ? : в C++

  1. ИМХО стоит добавить, что не все соглашения о кодировании вообще разрешают использовать тернарный оператор, т.к. часто падает простота восприятия кода.

    Вот так:

    variable == 1 ? cout << "Выберите операцию!\n..........\n\n" : cout << "До свидания! Не забудьте взять чек!\n\n";

    точно лучше не делать.
    1) У тебя variable – переменная типа bool, поэтому variable == 1 стоит заменить на variable.
    2) Ты сравниваешь булевую переменную с целым числом, это может запутать других программистов.
    3) По некоторым соглашениям о кодировании при сравнении на равенство константное выражение должно быть в левой части (чтобы не получилось написать variable = 1 вместо variable == 1, т.к. 1 = variable выдаст ошибку на этапе компиляции).
    4) я бы записал так:

    cout << (variable ? "Выберите операцию!\n..........\n\n" : "До свидания! Не забудьте взять чек!\n\n");

    Ряд товарищей посоветовали бы вместо variable написать true == variable, но тут можно спорить :).

    Вобщем весь код такой. Я бы это:

    max = (firstDigit > secondDigit) ? firstDigit : secondDigit;

    // так же определяем и записываем min
    min = (firstDigit < secondDigit) ? firstDigit : secondDigit;

    заменил так (примерно):

    a > b ? max = a, min = b : max = b, min = a;

    тут нет смысла выполнять сравнение 2 раза и нет смысла брать условие в скобки

    Из последнего примера видно, что двоеточием разделяется не одна команда и другая команда (как на твоем рисунке), а выражения. Притом я бы упомянул, что оператор запятая тоже возвращает значение.

    1. rrrFer (он же Владимир), это замечательно, что ты так тщательно вычитываешь наши статьи. Что можно сказать по твоему комментарию? Скажу так – совершенствовать и оптимизировать код можно до бесконечности. Благодаря твоему комментарию читатели увидят, что одну и ту же задачу можно решить различными способами и что есть разные варианты обращения с булевксими переменными. В твоем случае код более оптимизирован. А мой код расписан более подробно (так мы ориентируемся в первую очередь на новичков) и точно так же, как и твой код, имеет право на жизнь.
      P.S. Ругательства из твоего комментария удалены и в дальнейшем их видеть не хотелось бы

      1. Эммм… в моем комментарии были ругательства? )

        Я не вычитывал статьи вообще, я посмотрел рисунок и исходный код.

        Дело тут не в оптимизации, а в потенциальных косяках, которые никогда не появятся если следовать некоторым соглашениям.

        Ну например, когда ты сравниваешь булевую переменную с целым числом, что происходит? – происходит приведение типа bool к типу int, при этом в стандарте закреплено, что true соответствует единице, а false – нулю. Но если бы целое число кастовалось в bool, то 2 == true должно было бы вернуть true (но это не так, хотя всякие студенты и школьники могут сомневаться, ведь они не читали стандарт).

        Про соглашения я писал к тому, что есть подводные камни. Например однажды ты напишешь свой класс комплексных чисел и перегрузишь для него оператор сравнения и оператор приведения типа к bool. Я думаю, что можно получить разное и опасное поведение в этом случае. Т.е. правильнее сравнивать переменные одного типа, а не надеяться на то что оно автоматически скастуется.

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


        e = a < b ? b < c ? 1 : 2 : c < d ? 3 : 4;

        У нас к соглашении о кодировании были перечислены случаи когда РАЗРЕШАЕТСЯ использовать этот оператор чтобы не допустить вот такой код.

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

  2. В примере с if else значения max и min принимают 0, объясните пожалуйста в чем ошибка?

  3. а можно привести пример на си с использованием тернарного оператора для поиска минимального из трех чисел? никак не могу сообразить((

  4. Привет,для Вас прислали free билет на лото. Пройдите по ссылке ->> https://forms.yandex.ru/cloud/62eb57d1a73baf103e535cb5/?hs=423814bc7d948078983f9a5e855dfdc7&:

    6hn057

  5. В последнем листинге в 26-й строке ошибка – if (max == firstDigit), там должно быть написано if (firstDigit < secondDigit)

  6. rrrFer: Я думаю сначала надо построить забор а потом на него писать Причом на свой . Заборы бывают разной конфигурации

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

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