Сподіваюся, ви добре розібралися з темою операторы выбора if и else і вам не склало великих труднощів вирішитизадачи по цій темі. У цьому ж уроці ми продовжуємо вивчати основи програмування на C ++ і познайомимося ще з одним оператором вибору (ветвления) – це тернарный оператор ? :
Используется он обычно в тех случаях, якщо умова і код, который надо выполнить, в результате проверки условия, очень простые. К примеру, спросить у пользователя хочет он продолжить работать в программе или же хочет выйти из неё. Синтаксис такой:
Спочатку треба записати необхідне нам умову і за ним поставити знак питання ? . Далі, в этой же строке, после знака вопроса пишем первую простую команду (код), которая будет выполняться, если условие вернет истину (true). Після цієї команди ставимо двокрапку: и пишем вторую команду (код). Эта вторая команда после двоеточия, выполнится только в том случае, если условие возвращает ложь (false).
Приклад. Допустим пользователь снимает деньги в банкомате. Он провел эту операцию и на экране должен появиться вопрос: “Вы хотите выполнить другую операцию?” Користувачеві залишається зробити вибір (да или нет) и нажать соответствующую кнопку. Организуем этот выбор в следующей программе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); // значение этой переменной будет изменять пользователь bool variable = true; cout << "Выполнение каких-то транзакций по счету карты...\n"; cout << "Вы хотите выполнить другую операцию (1 - да, 0 - нет)? "; cin >> variable; variable == 1 ? cout << "Выберите операцию!\n..........\n\n" : cout << "До свидания! Не забудьте взять чек!\n\n"; return 0; } |
Пользователь делает выбор и вводит значение – рядок 13. А в строке 15 мы проверяем введенное значение. якщо умоваvariable == 1 возвращает true (то есть если переменная действительно равна 1), то выполнится код, расположенный после знака вопроса ? . А тот, что находится после двоеточия : – игнорируется. Иначе, если пользователь ввел 0, игнорируется код расположенный между ? і : , а выполняется второй код. Вот результат работы если введено 1:
если 0:
Вот еще один интересный пример. В нем, с помощью тернарного оператора, определяется минимальное и максимальное число из двух значений, которые введет пользователь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int firstDigit = 0; int secondDigit = 0; int max = 0; int min = 0; cout << "Введите firstDigit - первое число:"; cin >> firstDigit; cout << "Введите secondDigit - второе число:"; cin >> secondDigit; // используя тернарный оператор, определяем максимум // и сразу записываем его в переменную max max = (firstDigit > secondDigit) ? firstDigit : secondDigit; // так же определяем и записываем min min = (firstDigit < secondDigit) ? firstDigit : secondDigit; /*// или так: if (max == firstDigit) min = secondDigit; else min = firstDigit;*/ cout << "Максимум = " << max << endl; cout << "Минимум = " << min<< endl; return 0; } |
Рассмотрим строку 20. Код будет выполняться так – вначале отработает тернарный оператор, вернет значение исходя из поставленного условия, а после это значение запишется в переменную max. якщо умова(firstDigit > secondDigit) – істина, значениеfirstDigit записується в max , если ложь, то записывается значение secondDigit. Далі має бути все зрозуміло. Компилируем:
Программа работает отлично!
Добре про тернарного операторі розказано в цьому відео-уроці.
Напоследок добавлю, що в деяких угодах про кодування не рекомендують використовувати тернарний оператор через те, что снижается читабельность кода. Но знать о нём надо, так как никто не может предугадать, какие коды придется встретить и читать в будущем. Про угоди кодування більше можна дізнатися в нашій статті Форматування вихідного коду.
ІМХО варто додати, що не всі угоди про кодування взагалі дозволяють використовувати тернарний оператор, т.к. часто падає простота сприйняття коду.
Ось так:
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 рази і немає сенсу брати умова в дужки
З останнього прикладу видно, що двокрапкою поділяється не одна команда і інша команда (як на твоєму малюнку), а вираження. До того ж я б згадав, що оператор кома теж повертає значення.
rrrFer (він же Володимир), це чудово, що ти так ретельно вичитуєш наші статті. Що можна сказати по твоєму коментарю? скажу так – удосконалювати і оптимізувати код можна до нескінченності. Завдяки твоєму коментарю читачі побачать, що одну і ту ж задачу можна вирішити різними способами і що є різні варіанти поводження з булевксімі змінними. У твоєму випадку код більш оптимізований. А мій код розписаний більш детально (так ми орієнтуємося в першу чергу на новачків) і точно так же, як і твій код, має право на життя.
P.S. Лайки з твого коментаря видалені і надалі їх бачити не хотілося б
еммм… в моєму коментарі були лайки? )
Я не вичитував статті взагалі, я подивився малюнок і вихідний код.
Справа тут не в оптимізації, а в потенційних одвірках, які ніколи не з'являться якщо слідувати деяким угодам.
Ну наприклад, коли ти порівнюєш булева змінна з цілим числом, що відбувається? – відбувається приведення типу bool до типу int, при цьому в стандарті закріплено, що true відповідає одиниці, а помилкова – нулю. Але якби ціле число кастовать в bool, те 2 == True мало б повернути true (але це не так, хоча всякі студенти і школярі можуть сумніватися, адже вони не читали стандарт).
Про угоди я писав до того, що є підводні камені. Наприклад одного разу ти напишеш свій клас комплексних чисел і перенавантажуватимеш для нього оператор порівняння і оператор приведення типу до bool. Я вважаю, що можна отримати різний і небезпечну поведінку в цьому випадку. Тобто,. правильніше порівнювати змінні одного типу, а не сподіватися на те що воно автоматично скастуется.
Я вважаю, що акцент треба зробити на випадках, коли тернарний оператор треба застосовувати, т.е. коли він буде корисний. Без нього взагалі можна обійтися, але він є синтаксичним цукром, яким часто зловживають школярі і студенти. пишуть ось так приблизно:
e = a < b ? b < c ? 1 : 2 : c < d ? 3 : 4;
У нас до угоді про кодування були перераховані випадки коли ЗАБОРОНЕНО використовувати цей оператор щоб не допустити ось такий код.
Ми повністю згодні з тим, що без цього тернарного оператора можна обійтися в програмуванні. Але треба знати, що такий існує, як він виглядає і як працює. Ніколи не знаєш, який чужий код тобі доведеться читати і що там буде використано.
У прикладі з if else значення max і min приймають 0, поясніть будь ласка в чому помилка?
а можна привести приклад на сі з використанням тернарного оператора для пошуку мінімального з трьох чисел? ніяк не можу збагнути((
X = ( x1 < x2 && x1 < x3 ) ? x1 : x2 < x3 ? x2 : x3;
adfgag
Папа
6hn057
В останньому лістингу в 26-му рядку помилка – if (max == firstDigit), там має бути написано if (firstDigit < secondDigit)
rrrFer: Я думаю спочатку треба побудувати паркан, а потім на нього писати. . Паркани бувають різної конфігурації