netlib.narod.ru | < Назад | Оглавление | Далее > |
Выражение
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 | < Назад | Оглавление | Далее > |