К операциям присваивания относятся =, +=, –=, *= и /=, а также префиксные и постфиксные операции ++ и ––.
Операция присваивания обозначается символом '='. Простейший вид операции присвоения:
v = e;
здесь v – любое выражение, которое может принимать значение,
e – произвольное выражение.
Операция присвоения выполняется справа налево, т.е. сначала вычисляется значение выражения e, а затем это значение присваивается левому операнду v. Левый операнд в операции присваивания должен быть так называемым адресным выражением (lvalue – выражение, допустимое слева). Примером адресного, или именующего, выражения является имя переменной.
Например, не являются адресными выражения a+b, 45, sqrt(4). Адресным выражением никогда не являются константы.
Т.к. присваивание является операцией, то она возвращает значение, которым является значение, присвоенное в левый операнд. Отсюда следует, что возможна, например, такая запись:
a = b = c = d = e + 2;
Здесь сначала вычисляется самое правое выражение, т.е. e+2. Результат сложения присваивается в d. Эта операция присваивания возвращает присвоенное значение, которое «переходит дальше», т.е. присваивается в c(а потом в b и a).
Если тип правого операнда не совпадает с типом левого, то значение справа преобразуется к типу левого операнда (если это возможно). При этом может произойти потеря значения, например:
int i;
char ch;
short sh; i = 3.14;
ch = 777;
sh = i;
Здесь i получает значение 3, т.к. преобразование вещественного числа в целое означает отбрасывание дробной части. Значение 777 слишком велико, чтобы быть представленным как char, поэтому значение ch будет зависеть от способа, которым конкретная реализация производит преобразование из большего в меньший целый тип.
В последней строке примера тип int(4 байта) преобразуется в тип short (2 байта). При этом старшие байты, которые не могут быть сохранены в целевом типе, просто отбрасываются. В данном случае в i находится значение 3, которое занимает только самый младший байт, поэтому потери данных не произойдет. Но в общем случае такие присваивания некорректны и опасны.
Существует так называемая комбинированная операция присваивания вида:
a X= b,
здесь X – знак одной из бинарных операций: + – * / % >> << & | ^ && ||.
Эти операции являются укороченной формой записи операции присваивания.
Запись a X= b аналогична a = a X b.
То есть:
а += b означает а = а + b.
а –= b означает а = а – b.
и так далее.
Преимущества комбинированных операций присваивания заключаются в том, что они компактнее традиционных присваиваний и компилятор генерирует для них более эффективный машинный код.