26
Тернарный оператор
Категория: Культура кода Автор: Дмитрий Ляпин Опубликовано: 26-03-2010
Метки: тернарный оператор
Тернарный оператор – шедевр лаконичности и выразительности, появившийся впервые в языке Си. Он перекочевал во все Си-подобные языки, как-то: C++, C#, Java, PHP, JavaScript и др. Как это ни странно, немало даже опытных программистов избегают тернарный оператор, используя для проверки условия лишь старый добрый if-else. Это свойственно в основном разработчикам, много лет программирующим на Delphi. Там такого чудесного оператора нет. В статье я покажу, насколько данная конструкция может преобразить программный код.
Общий вид:
<условие> ? <результат_1> : <результат_2>
Пример на PHP:
function max($a, $b) { return ($a > $b) ? $a : $b; }
Тернарный оператор может использоваться в выражении (в отличии от if-else).
Он принимает три операнда:
- условие
- результат_1
- результат_2
Если условие истинно, оператор вернет результат_1, иначе результат_2. В языках со строгой типизацией результат_1 и результат_2 должны быть одного типа.
Ниже приведены несколько примеров замены if-else на тернарный оператор.
Вычисление факториала (Си):
int fact(int x) { if (x == 0) return 1; else return x * fact(x - 1); } int fact(int x) { return (x == 0) ? 1 : x * fact(x - 1); }
Вывод длины списка (PHP):
$count = count($items); if ($count == 0) echo "Список пуст"; else echo "Элементов в списке: $count"; echo ($count == 0) ? "Список пуст" : "Элементов в списке: $count";
И, наконец, шедевр моей практики…
Проверка, входит ли число в диапазон (C#):
m_from – левая граница интервала
m_to – правая граница интервала
leftInclude – включать ли левую границу
rightInclude – включать ли правую границу
public bool IsInRange(double value, bool leftInclude, bool rightInclude) { bool c1, c2; if (leftInclude) c1 = (value >= m_from); else c1 = (value > m_from); if (rightInclude) c2 = (value <= m_to); else c2 = (value < m_to); return (c1 && c2); } public bool IsInRange(double value, bool leftInclude, bool rightInclude) { return (leftInclude ? (value >= m_from) : (value > m_from)) && (rightInclude ? (value <= m_to) : (value < m_to)); }
Курс PHP за 2 недели показал, что ученики избегают тернарный оператор. Вероятно, это происходит потому, что проверка условия однозначно ассоциируется с конструкцией if-else. А зря.
Пользуйтесь тернарным оператором! Он действительно очень удобен.






Нужно было бы упомянуть о пользе запятой в таких конструкциях.
Очень удобный оператор, а я даже не знал о нем. Кстати, у вас вводный каст к тренингу «PHP за 2 недели» не скачивается.
2Max: спасибо, ссылку поправили
а обязательно тренарный оператор должен быть аргументом функции вывода или возврата? может он быть не аргументом?
Lokser, да. Тернарный оператор может быть и не аргументом функции, а просто отдельной конструкцией.
очень удобно. почему-то об этом нигде не встречал упоминания.
Согласен. Про запятую забыли зря!
Ктонить, раскажите вкратце что там с точкой, пожалуйста.
с языками Си мало знаком. но если так посмотреть он позволяет только сократить код.
а в чем преимущество?
это типа если выбирать между Delphi и Си – делают одно и то же, только на Delphi легче, а на Си моднее что ли (хотя и посложнее).
спрашивается, зачем мудрить
поправьте меня, если не прав
Сократить код – основное преимущество. И оно дорого стоит. Когда один и тот же алгоритм можно описать многословно или кратко, как лучше? Думаю, ответ очевиден.
Delphi (Pascal) – прекрасный язык для того, чтобы начать изучать программирование. Это классика. Ну а Си для тех, кто хочет писать меньше, а делать больше) Не даром почти все современные языки – си-подобные.
Я не хочу сказать, что один язык хорош, а другой плох. По сути все равно на чем писать, это лишь инструмент. Просто важно понимать, что для каждой задачи хорош свой. И чем большими инструментами вы владеете – тем больше у вас возможностей.
вот с РНР и начну изучение Си языков.
но пока с ними не знаком хотел бы спросить –
какие языки интуитивно понятней – Паскаль или Си?
это похоже на использование WinApi в Делфи, позволяет сократить код (правда пользуюсь редко, мало знаком)
Насчет WInApi путаете, его использование не может сократить код.
Насчет Паскаля – обычно начинают обучение программированию в ВУЗах именно с него. Потом Си. Паскаль более понятен человеку, который знакомится с программированием впервые.
ну да…, смарозил на счет ВинАпи
перепутал с встроенными функциями…
Последний пример конечно выразителен, но решается и вовсе одними булевыми операциями, т.е тернарный там вроде как и не очень-то и нужен.
Кстати, на счет вычисления факториала с помощью рекурсии, Макконелл в своей книге «Совершенный код», такой подход ругает.
Он говорит: «если бы программист работающий у меня, применял рекурсию для вычисления факториала, я бы нанял кого-то другого…..не считая медленного выполнения и непредсказуемого использования памяти, рекурсивный вариант функции труднее для понимания…….»
Pavel
Во во, согласен с ним, хоть по началу рекурсии сложны для понимания.
Вопрос какой код лучше выполнится – короткий на Си-подобных языках или длинный на Паскале не вполне корректный. Все зависит от конкретного компилятора того или иного языка, от оптимизатора двоичного кода. И подчеркну качественный код легче написать и отладить на удобно читаемом и интуитивно понятном языке.