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

2.10. Операторы присваивания и выражения

Выражение

    i = i + 2

в котором стоящая слева переменная повторяется и справа, можно написать в сжатом виде:

    i += 2

Оператор +=, как и оператор =, называется оператором присваивания.

Большинству бинарных операторов (аналогичных + и имеющих левый и правый операнды) соответствуют операторы присваивания вида op=, где op — один из следующих операторов:

    +  -  *  /  %  <<  >>  &  ^  |
<

Для двух выражений запись

    выражение1 op= выражение2

эквивалентна записи

    выражение1 = (выражение1) op (выражение2)

с той лишь разницей, что выражение1 вычисляется только один раз. Обратите внимание на скобки вокруг выражения2:

    x *= y + 1

эквивалентно

    x = x * (y + 1)

но не

    x = x * y + 1

В качестве примера приведем функцию bitcount, подсчитывающую число единичных битов в своем аргументе целочисленного типа.

/* bitcount: подсчет единичных разрядов в x */
int bitcount (unsigned x)
{
    int b;
    for(b = 0; x != 0; x >>= 1)
        if (x & 01)
            b++;
    return b;
}

Независимо от машины, на которой будет работать эта программа, объявление аргумента x как unsigned гарантирует, что при сдвиге вправо освобождающиеся биты будут заполняться нулями, а не знаковым битом.

Помимо краткости операторы присваивания обладают тем преимуществом, что они более соответствуют образу мышления человека. Мы говорим «прибавить 2 к i» или «увеличить i на 2», а не «взять i, добавить 2 и вернуть результат в i», так что выражение i += 2 лучше, чем i = i + 2.

Кроме того, в сложных выражениях вроде

    yyval[yypv[p3+p4] + yypv[p1+p2]] += 2

благодаря оператору присваивания += запись становится более легкой для понимания, так как читателю при такой записи не потребуется старательно сравнивать совпадают ли два длинных выражения, или выяснять, почему они не совпадают. Следует иметь в виду и то, что подобные операторы присваивания могут помочь компилятору сгенерировать более эффективный код.

Мы уже видели, что оператор присваивания вырабатывает значение и может применяться внутри выражения, например:

    while ((c = getchar()) != EOF)
        . . .

В подобной конструкции могут использоваться и другие операторы присваивания (+=, -= и т.д.), хотя такая ситуация встречается значительно реже.

Во всех подобных выражениях типом выражения присваивания считается тип левого операнда, а значением — значение левого операнда после присваивания.


Упражнение 2-9


В системах, где для представления чисел использован дополнительный код, выражение x &= (x - 1) делает равным нулю самый младший разряд x, который был равен 1. Объясните, почему. Используйте это наблюдение для написания более быстрого варианта функции bitcount.



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

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