Выражение
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;
}
Кроме того, в сложных выражениях вроде
yyval[yypv[p3 + p4] + yypv[p1 + p2]] += 2
благодаря оператору присваивания += запись становится более легкой для понимания, так как читателю при такой записи не потребуется старательно сравнивать два длинных выражения.
Присваивание вырабатывает значение и может применяться внутри выражения:
Типом и значением любого выражения присваивания являются тип и значение его левого операнда после завершения присваивания.
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
#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)
...
...
В выражениях встречаются и другие операторы присваивания (+=, -= и т.д.), хотя и реже.
Типом и значением любого выражения присваивания являются тип и значение его левого операнда после завершения присваивания.
Комментариев нет:
Отправить комментарий