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

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

Выражение

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, подсчитывающую число единичных битов в своем аргументе целочисленного типа:

#include <stdio.h>

int bitcount(unsigned x);

int main(void)
{
printf("%u\n", bitcount(100));
return 0;
}

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

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

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

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

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

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

while ((с = getchar()) != EOF)
    ...
В выражениях встречаются и другие операторы присваивания (+=, -= и т.д.), хотя и реже.

Типом и значением любого выражения присваивания являются тип и значение его левого операнда после завершения присваивания.

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

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