Условные выражения
операторы
if (a > b) z = a; else z = b;
конечно вычисляют в z максимум из а и в. Условное выражение, записанное с помощью тернарной операции "?:", предоставляет другую возможность для записи этой и аналогичных конструкций. В выражении
е1 ? Е2 : е3
сначала вычисляется выражение е1. Если оно отлично от нуля (истинно), то вычисляется выражение е2, которое и становится значением условного выражения. В противном случае вычисляется е3, и оно становится значением условного выражения. Каждый раз вычисляется только одно из выражения е2 и е3. Таким образом, чтобы положить z равным максимуму из а и в, можно написать
z = (a > b) ? a : b; /* z = max(a,b) */
Следует подчеркнуть, что условное выражение действительно является выражением и может использоваться точно так же, как любое другое выражение. Если е2 и е3 имеют разные типы, то тип результата определяется по правилам преобразования, рассмотренным ранее в этой лекции. Например, если f имеет тип float, а n - тип int, то выражение
(n > 0) ? f : n
Имеет тип double независимо от того, положительно ли n или нет.
Так как уровень старшинства операции ?: очень низок, прямо над присваиванием, то первое выражение в условном выражении можно не заключать в круглые скобки. Однако, мы все же рекомендуем это делать, так как скобки делают условную часть выражения более заметной.
Использование условных выражений часто приводит к коротким программам. Например, следующий ниже оператор цикла печатает n элементов массива, по 10 в строке, разделяя каждый столбец одним пробелом и заканчивая каждую строку (включая последнюю) одним символом перевода строки.
for (i = 0; i < n; i++) printf("%6d%c",a[i],(i%10==9 || i==n-1) ? '\n' : ' ')
Символ перевода строки записывается после каждого десятого элемента и после n-го элемента. За всеми остальными элементами следует один пробел. Хотя, возможно, это выглядит мудреным, было бы поучительным попытаться записать это, не используя условного выражения.
Упражнение 2-10
Перепишите программу для функции lower, которая переводит прописные буквы в строчные, используя вместо конструкции if-else условное выражение.