Вирази на зразок
if (a > b)
z = a;
else
z = b;
обчислюють z як найбільше значення з-поміж a та b. Умовний вираз із використанням трійчастого оператора «?:» дають альтернативний спосіб написання подібної конструкції. У виразі
expr1 ? expr2 : expr3
вираз expr1 розглядається першим. Якщо expr1 ненульовий (істина), тоді обчислюється expr2, і це й буде кінцевим значенням цілого виразу умови. У протилежному випадку, обчислюється expr3, і він стане кінцевим значенням. Оцінюється тільки один із expr2 та expr3. Таким чином, щоб встановити z до максимального значення a або b, ми напишемо
z = (a > b) ? a : b; /* z = max(a, b) */
Слід зауважити, що вираз умови — це дійсно вираз, і може бути використаний там де будь-який інший. Якщо expr2 і expr3 — різних типів, тип результату визначається правилами перетворення, обговорених раніше в цьому розділі. Наприклад, якщо f має тип float, а n — це int, тоді вираз
(n > 0) ? f : n
буде типу float, незалежно від того, чи n додатній.
Дужки не обов'язкові навколо першого виразу оскільки пріоритет ? й : дуже низький, лишень трохи вищий за присвоєння. Проте, їх рекомендовано вживати, оскільки вони роблять умовну частину виразу очевиднішою.
Умовні вирази, як правило, призводять до стислішого коду. Наприклад, наступний цикл виводить n елементів масиву, по 10 на кожний рядок, стовпчики будучи розділені пробілом, кожний рядок (включаючи останній) завершується символом нового рядка.
for (i = 0; i < n; i++)
printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' ');
Символ нового рядка виводиться після кожного десятого елемента і після n-нного. За рештою елементів слідує пробіл. Це може здаватися складним, але воно компактніше ніж еквівалент ізif-else. Іншим хорошим прикладом є
printf("You have %d items%s.\n", n, n==1 ? "" : "s");
Вправа 2-10. Перепишіть функцію lower, яка обертає літери верхнього регістру на нижній, за використанням виразу умови замість if-else.