Книга: Язык программирования Си. Издание 3-е, исправленное
2.10 Операторы и выражения присваивания
2.10 Операторы и выражения присваивания
Выражение
i = i + 2;
в котором стоящая слева переменная повторяется и справа, можно написать в сжатом виде:
i += 2;
Оператор +=, как и =, называется оператором присваивания.
Большинству бинарных операторов (аналогичных + и имеющих левый и правый операнды) соответствуют операторы присваивания op=, где op - один из операторов
+
-
*
/
%
‹‹
››
&
^
|
Если выр1 и выр2 - выражения, то
выр1 op= выр2
Эквивалентно
выр1 = (выр1) op (выр2)
с той лишь разницей, что выр1 вычисляется только один раз. Обратите внимание на скобки вокруг выр2:
x *= y + 1
эквивалентно
x = x * (y + 1)
но не
x=x*y+1
В качестве примера приведем функцию bitcount, подсчитывающую число единичных битов в своем аргументе целочисленного типа.
/* bitcount: подсчет единиц в х */
int bitcount(unsigned х)
{
int b;
for (b = 0; х != 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 ((с = getchar()) != EOF)
В выражениях встречаются и другие операторы присваивания (+=, -= и т. д.), хотя и реже. Типом и значением любого выражения присваивания являются тип и значение его левого операнда после завершения присваивания.
Упражнение 2.9. Применительно к числам, в представлении которых использован дополнительный код, выражение x &= (x-1) уничтожает самую правую 1 в x. Объясните, почему. Используйте это наблюдение при написании более быстрого варианта функции bitcount.
- 2.1 Имена переменных
- 2.2 Типы и размеры данных
- 2.3 Константы
- 2.4 Объявления
- 2.5 Арифметические операторы
- 2.6 Операторы отношения и логические операторы
- 2.7 Преобразования типов
- 2.8 Операторы инкремента и декремента
- 2.9 Побитовые операторы
- 2.10 Операторы и выражения присваивания
- 2.11 Условные выражения
- 2.12 Приоритет и очередность вычислений
- 4.1.2. Арифметические операторы присваивания
- Булевы операторы
- Оператор присваивания
- 5. Операции, выражения и операторы
- 4 Выражения и операторы
- Операторы
- 4.8. Арифметические выражения
- 4.11. Выражения присваивания
- Арифметические операторы
- Индексы по выражениям
- Выражения в значениях по умолчанию для доменов
- Выражения в EXCEPTION