Тернарный оператор

Категория: Культура кода Автор: Дмитрий Ляпин Опубликовано: 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
  3. результат_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. А зря.

Пользуйтесь тернарным оператором! Он действительно очень удобен.

Тернарный оператор5.051

Комментарии:

Оставить комментарий!