netlib.narod.ru< Назад | Оглавление | Далее >

2.11. Условные выражения

Последовательность операторов

    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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz