Сокращенная запись операции присваивания
Операция присваивания
Операции (продолжение).
Формат операции присваивания:
Операнд_1 = Операнд_2
Операндом_1 может быть только переменная. Этот (левый) операнд операции присваивания получил название L–значение, (L–value, Left–value). Операндом_2 может быть любое выражение, составленное в соответствии с синтаксисом языка Си. Этот (правый) операнд операции присваивания назвали R–значение, (R–value, Right–value).
Операция присваивания может быть как отдельным оператором (тогда после нее ставится знак ; ), так и частью другого выражения (тогда ее результатом считается присвоенное значение). Если в выражении подряд без скобок идут несколько операций = , то они выполняются справа налево, например:
int i, j, k;
float x, y, z;
...
i = j = k = 0; « k = 0, j = 0, i = 0;
x = i + (y = 3) – (z = 0); « z = 0, y = 3, x = i + y – z;
Примеры недопустимых выражений:
– присваивание константе: 2 = x + y;
– присваивание функции: getch() = i;
– присваивание результату операции: (i + 1) = 2 + y;
В языке Си используются два вида сокращенной записи операции присваивания:
1) вместо записи:
v = v # e;
где # – любая арифметическая или битовая операция, рекомендуется использовать запись v #= e;
Например,
i = i + 2; « i += 2; (+= – без пробелов);
2) вместо записи:
x = x # 1;
где # означает + либо - , x – переменная одного из целочисленных типов (или переменная-указатель), рекомендуется использовать запись:
##x; – префиксную, или x##; – постфиксную.
Если эти операции используются в отдельном виде, то различий между постфиксной и префиксной формами нет. Если же они используются в выражении, то в префиксной форме (##x), сначала значение x изменится на 1, а затем будет использовано в выражении; в постфиксной форме (x##) – сначала значение используется в выражении, а затем изменяется на 1. (Операции над указателями будут рассмотрены позже.)
Рекомендации использования сокращений обоснованы возможностью оптимизации программы (ускорение в работе программы), т.к. схема выражения вида v #= e соответствует схеме выполнения многих машинных команд типа "регистр-память".