Составное присваивание
Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют вид:
(операнд-1) (бинарная операция) = (операнд-2) .
Составное присваивание по результату эквивалентно следующему простому присваиванию:
(операнд-1) = (операнд-1) (бинарное операция) (операнд-2) .
Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды.
Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций (+=) (-=) может быть указатель, в то время как правый операнд должен быть целым числом.
Примеры:
double arr[4]={ 2.0, 3.3, 5.2, 7.5 } ;
double b=3.0;
b+=arr[2]; /* эквивалентно b=b+arr[2] */
arr[3]/=b+1; /* эквивалентно arr[3]=arr[3]/(b+1) */
Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.
Приоритеты операций и порядок вычислений
В языке СИ операции с высшими приоритетами вычисляются первыми. Наивысшим приоритетом является приоритет равный 1. Приоритеты и порядок операций приведены в табл. 8.
Таблица 8
Приоритет | Знак операции | Типы операции | Порядок выполнения |
() [] . —> | Выражение | Слева направо | |
- ~ ! * & ++ —- sizeof приведение типов | Унарные | Справа налево | |
* / % | Мультипликативные | Слева направо | |
+ — | Аддитивные | ||
<< >> | Сдвиг | ||
< > <= >= | Отношение | ||
== != | Отношение (равенство) | ||
& | Поразрядное И | ||
^ | Поразрядное исключающее ИЛИ | ||
| | Поразрядное ИЛИ | ||
&& | Логическое И | ||
|| | Логическое ИЛИ | ||
? : | Условная | ||
= *= /= %= += —= &= |= >>= <<= ^= | Простое и составное присваивание | Справа налево | |
, | Последовательное вычисление | Слева направо |
Побочные эффекты
Операции присваивания в сложных выражениях могут вызывать побочные эффекты, так как они изменяют значение переменной. Побочный эффект может возникать и при вызове функции, если он содержит прямое или косвенное присваивание (через указатель). Это связано с тем, что аргументы функции могут вычисляться в любом порядке. Например, побочный эффект имеет место в следующем вызове функции:
prog (a,a=k*2);
В зависимости от того, какой аргумент вычисляется первым, в функцию могут быть переданы различные значения.
Порядок вычисления операндов некоторых операций зависит от реализации, и поэтому могут возникать разные побочные эффекты, если в одном из операндов используется операции увеличения или уменьшения, а также другие операции присваивания.
Например, выражение i*j+(j++)+(--i) может принимать различные значения при обработке разными компиляторами. Чтобы избежать недоразумений при выполнении побочных эффектов необходимо придерживаться следующих правил.
1. Не использовать операции присваивания переменной в вызове функции, если эта переменная участвует в формировании других аргументов функции.
2. Не использовать операции присваивания переменной в выражении, если эта переменная используется в выражении более одного раза.
Дата добавления: 2016-07-27; просмотров: 1819;