Операции и выражения присваивания
Такие выражения, как
i = i + 2
в которых левая часть повторяется в правой части могут быть записаны в сжатой форме
i += 2
используя операцию присваивания вида +=.
Большинству бинарных операций (операций подобных +, которые имеют левый и правый операнд) соответствует операция присваивания вида оп=, где оп - одна из операций
+ - * / % << >> & \^ \!
Если е1 и е2 - выражения, то е1 оп= е2 эквивалентно
е1 = (е1) оп (е2)
за исключением того, что выражение е1 вычисляется только один раз. Обратите внимание на круглые скобки вокруг е2:
x *= y + 1
то
x = x * (y + 1)
не
x = x * y + 1
В качестве примера приведем функцию bitcount, которая подсчитывает число равных 1 битов у целого аргумента.
bitcount(n) /* count 1 bits in n */ unsigned n; ( int b; for (b = 0; n != 0; n >>= 1) if (n & 01) b++; return(b); )
Не говоря уже о краткости, такие операторы присваивания имеют то преимущество, что они лучше соответствуют образу человеческого мышления. Мы говорим: "прибавить 2 к i" или "увеличить i на 2", но не "взять i, прибавить 2 и поместить результат опять в i". Итак, i += 2. Кроме того, в громоздких выражениях, подобных
yyval[yypv[p3+p4] + yypv[p1+p2]] += 2
Tакая операция присваивания облегчает понимание программы, так как читатель не должен скрупулезно проверять, являются ли два длинных выражения действительно одинаковыми, или задумываться, почему они не совпадают. Такая операция присваивания может даже помочь компилятору получить более эффективную программу.
Мы уже использовали тот факт, что операция присваивания имеет некоторое значение и может входить в выражения; самый типичный пример
while ((c = getchar()) != EOF)
присваивания, использующие другие операции присваивания (+=, -= и т.д.) также могут входить в выражения, хотя это случается реже.
типом выражения присваивания является тип его левого операнда.
Упражнение 2-9
В двоичной системе счисления операция x&(x-1) обнуляет самый правый равный 1 бит переменной x.(почему?) используйте это замечание для написания более быстрой версии функции bitcount.