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