Основи програмування на С ++ для початківців

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

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

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

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

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

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

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

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

если 0:

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

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

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

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

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

Добре про тернарного операторі розказано в цьому відео-уроці.

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

13 думки про "Тернарний оператор ? : в C++

  1. ІМХО варто додати, що не всі угоди про кодування взагалі дозволяють використовувати тернарний оператор, т.к. часто падає простота сприйняття коду.

    Ось так:

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

    точно краще не робити.
    1) У тебе variable – змінна типу bool, тому variable == 1 варто замінити на variable.
    2) Ти порівнюєш булева змінна з цілим числом, це може заплутати інших програмістів.
    3) За деякими угодами про кодування при порівнянні на рівність константний вираз має бути в лівій частині (щоб не вийшло написати variable = 1 замість змінної == 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 відповідає одиниці, а помилкова – нулю. Але якби ціле число кастовать в 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: Я думаю спочатку треба побудувати паркан, а потім на нього писати. . Паркани бувають різної конфігурації

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *