Кроме простого присваивания, имеется целая группа операций присваивания, которые объединяют простое присваивание с одной из бинарных операций. Такие операции называются составными операциями присваивания и имеют вид:
ИдентификаторПеременной БинарнаяОперация = Выражение
Допустимые БинарныеОперации: + - * / % >> << & ~ |Составное присваивание по результату эквивалентно следующему простому присваиванию:
ИдентификаторПеременной = Выражение1 БинарнаяОперация Выражение2.
Отметим, что выражение составного присваивания с точки зрения реализации не эквивалентно простому присваиванию, так как в последнем операнд-1 вычисляется дважды.
Каждая операция составного присваивания выполняет преобразования, которые осуществляются соответствующей бинарной операцией. Левым операндом операций (+=) (-=) может быть указатель, в то время как правый операнд должен быть целым числом.
Примеры:
double a=5.2; double b=3.0; b+=a; /* эквивалентно b=b+a */ a/=b+1; /* эквивалентно a=a/(b+1)*/ a-=4; /* эквивалентно a=a-4*/Заметим, что при втором присваивании использование составного присваивания дает более заметный выигрыш во времени выполнения, так как левый операнд является индексным выражением.
|
|
Побочные эффекты
Операции присваивания в сложных выражениях могут вызывать побочные эффекты, так как они изменяют значение переменной. Побочный эффект может возникать и при вызове функции, если он содержит прямое или косвенное присваивание (через указатель). Это связано с тем, что аргументы функции могут вычисляться в любом порядке. Например, побочный эффект имеет место в следующем вызове функции:
prog (a,a=k*2);
В зависимости от того, какой аргумент вычисляется первым, в функцию могут быть переданы различные значения.
Порядок вычисления операндов некоторых операций зависит от реализации, и поэтому могут возникать разные побочные эффекты, если в одном из операндов используется операции увеличения или уменьшения, а также другие операции присваивания.
Например, выражение i*j+(j++)+(--i) может принимать различные значения при обработке разными компиляторами. Чтобы избежать недоразумений при выполнении побочных эффектов необходимо придерживаться следующих правил.
1. Не использовать операции присваивания переменной в вызове функции, если эта переменная участвует в формировании других аргументов функции.
2. Не использовать операции присваивания переменной в выражении, если эта переменная используется в выражении более одного раза.