Операторы присваивания
Синтаксис
expression
assignment-operator
expression
assignment-operator
: один из следующих символов:
=
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
Комментарии
Операторы присваивания сохраняют значение в объекте, указанном операндом слева. Существует два типа операций назначения:
простое присваивание, при котором значение второго операнда хранится в объекте, указанном первым операндом.
составное присваивание, при котором перед сохранением результата выполняется арифметическая, сдвиговая или побитовая операция.
Все операторы присваивания в следующей таблице, кроме оператора , =
являются составным оператором присваивания.
Таблица операторов присваивания
Оператор | Значение |
---|---|
= |
Сохранение значения второго операнда в объект, указанный первым операндом (простое присваивание). |
*= |
Умножение значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
/= |
Деление значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
%= |
деление по модулю первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
+= |
Сложение значения первого операнда со значением второго операнда; сохранение результата в объект, указанный первым операндом. |
-= |
Вычитание значения второго операнда из значения первого операнда; сохранение результата в объект, указанный первым операндом. |
<<= |
Сдвиг значения первого операнда влево на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом. |
>>= |
Сдвиг значения первого операнда вправо на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом. |
&= |
Выполнение операции побитового И для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
^= |
Выполнение операции побитового исключающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
|= |
Выполнение операции побитового включающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
Ключевые слова операторов
Три из составных операторов присваивания имеют ключевое слово эквивалентов. К ним относятся:
Оператор | Эквивалентный |
---|---|
&= |
and_eq |
|= |
or_eq |
^= |
xor_eq |
В C++ эти ключевые слова операторов указываются как альтернативные варианты написания для составных операторов присваивания. В C альтернативные варианты написания предоставляются в виде макросов в заголовке <iso646.h> . В C++ альтернативными вариантами орфографии являются ключевые слова; <Использование iso646.h> или эквивалента <C++ ciso646> не рекомендуется. В Microsoft C++ для включения альтернативной /permissive-
орфографии требуется параметр компилятора или /Za
.
Пример
// expre_Assignment_Operators.cpp
// compile with: /EHsc
// Demonstrate assignment operators
#include <iostream>
using namespace std;
int main() {
int a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555;
a += b; // a is 9
b %= a; // b is 6
c >>= 1; // c is 5
d |= e; // Bitwise--d is 0xFFFF
cout << "a = 3, b = 6, c = 10, d = 0xAAAA, e = 0x5555" << endl
<< "a += b yields " << a << endl
<< "b %= a yields " << b << endl
<< "c >>= 1 yields " << c << endl
<< "d |= e yields " << hex << d << endl;
}
Простое присваивание
Простой оператор присваивания (=
) приводит к тому, что значение второго операнда сохраняется в объекте, указанном первым операндом. Если оба объекта относятся к арифметическим типам, правый операнд преобразуется в тип левого перед сохранением значения.
const
Объекты типов и volatile
могут быть назначены l-значениям типов, которые являются только volatile
или не const
являются или volatile
.
Назначение объектам типа класса (struct
, , union
и class
) выполняется функцией с именем operator=
. По умолчанию эта функция-оператор производит побитовое копирование; однако такое поведение можно изменить с помощью перегруженных операторов. Для получения дополнительной информации см. раздел Перегрузка операторов. Типы классов также могут иметь операторы присваивания копирования и перемещения . Дополнительные сведения см. в разделах Копирование конструкторов и операторов назначения копирования и Перемещение конструкторов и перемещение операторов присваивания.
Объект любого класса, однозначно производного от некоторого базового класса, можно присвоить объекту этого базового класса. Обратное неверно, так как существует неявное преобразование из производного класса в базовый класс, но не из базового класса в производный класс. Пример:
// expre_SimpleAssignment.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class ABase
{
public:
ABase() { cout << "constructing ABase\n"; }
};
class ADerived : public ABase
{
public:
ADerived() { cout << "constructing ADerived\n"; }
};
int main()
{
ABase aBase;
ADerived aDerived;
aBase = aDerived; // OK
aDerived = aBase; // C2679
}
Присваивание ссылочным типам выполняется так, как если бы выполнялось присваивание объекту, на который указывает ссылка.
Для объектов типа класса присваивание отличается от инициализации. Для иллюстрации того, насколько сильно присваивание может отличаться от инициализации, рассмотрим код
UserType1 A;
UserType2 B = A;
В предыдущем коде показан инициализатор; он вызывает конструктор для типа UserType2
, который принимает аргумент типа UserType1
. В коде
UserType1 A;
UserType2 B;
B = A;
оператор присваивания
B = A;
может вызывать одно из указанных ниже действий.
Вызовите функцию
operator=
дляUserType2
, еслиoperator=
предоставляетсяUserType1
аргумент .Вызывать функцию явного преобразования
UserType1::operator UserType2
, если такая функция существует.Вызывать конструктор
UserType2::UserType2
, если он существует, принимает аргументUserType1
и копирует результат.
Составное присваивание
Составные операторы присваивания отображаются в таблице Операторы назначения. Эти операторы имеют форму e1op= e2, где e1 — неизменяемоеconst
l-значение, а e2 —:
арифметический тип
указатель, если op имеет значение
+
или-
Форма e1op= e2 ведет себя как e1=
операцияe2, но e1 вычисляется только один раз.
Составное присваивание перечисляемому типу создает сообщение об ошибке. Если левый операнд имеет тип указателя, правый операнд должен иметь тип указателя или быть константным выражением, результатом которого является 0. Если левый операнд имеет целочисленный тип, правый операнд не должен иметь тип указателя.
Результат операторов присваивания
Операторы присваивания возвращают значение объекта, указанного левым операндом после присваивания. Результирующий тип — это тип левого операнда. Результатом выражения присваивания всегда является l-значение. Эти операторы имеют ассоциативность справа налево. Левый операнд должен быть изменяемым l-значением.
В ANSI C результат выражения присваивания не является l-значением. Это означает, что допустимое выражение (a += b) += c
C++ запрещено в C.
См. также раздел
Выражения с бинарными операторами
Встроенные операторы C++, приоритет и ассоциативность
Операторы присваивания C