пятница, 21 ноября 2014 г.

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

Инструкции

if (а > b)
    z = a;
else
    z = b;

пересылают в z большее из двух значений a и b. Условное выражение, написанное с помощью тернарного (т.е. имеющего три операнда) оператора ?:, представляет собой другой способ записи этой и подобных ей конструкций:

z = (a > b) ? а : b; /* z = max(a, b) */

В выражении

выр1 ? выр2 : выр3

первым вычисляется выражение выр1. Если его значение не нуль (истина), то вычисляется выражение выр2 и значение этого выражения становится значением всего условного выражения. В противном случае вычисляется выражение выр3 и его значение становится значением условного выражения. Следует отметить, что из выражений выр2 и выр3 вычисляется только одно из них.

Условное выражение и в самом деле является выражением, и его можно использовать в любом месте, где допускается выражение.

Если выр2 и выр3 принадлежат разным типам, то тип результата определяется правилами преобразования, о которых шла речь ранее. Например, если f имеет тип float, a n — тип int, то типом выражения

(n > 0) ? f : n

будет float вне зависимости от того, положительно значение n или нет.

Заключать в скобки первое выражение в условном выражении не обязательно, так как приоритет ?: очень низкий (более низкий приоритет имеет только присваивание), но авторы книги рекомендуют всегда это делать, для лучшего восприятия.

В качестве примера приведится цикл, обеспечивающий печать n элементов массива по 10 на каждой строке с одним пробелом между колонками; каждая строка цикла, включая последнюю, заканчивается символом новой строки:

#include <stdio.h>

int main(void)
{
    int i, n;
    char a[] = "C is a general-purpose programming language initially developed by Dennis Ritchie.";
    n = sizeof(a);

    for (i = 0; i < n; i++)
        printf("%6d%c", a[i], (i % 10 == 9 || i == n - 1) ? '\n' : ' ');
    return 0;
}

Символ новой строки посылается после каждого десятого и после n-го элемента. За всеми другими элементами следует пробел.

Еще один пример:

#include <stdio.h>
int main(void)
{
    int n;
    char a[] = "Привет, мир!";
    n = sizeof(a);

    printf("Вы имеете %d элемент%s.\n", n, (n % 10 == 1 && n % 100 != 11) ?
    " " : ((n % 100 < 10 || n % 100 > 20) && n % 10 >= 2 && n % 10 <= 4) ?
    "а" : "ов");

    return 0;
}

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

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