операторы присваивания;

Синтаксис

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=. По умолчанию эта функция оператора выполняет назначение нестатических элементов данных объекта и прямых базовых классов; однако это поведение можно изменить с помощью перегруженных операторов. Для получения дополнительной информации см. раздел Перегрузка операторов. Типы классов также могут иметь операторы назначения копирования и перемещения. Дополнительные сведения см. в разделе "Копирование конструкторов" и операторовназначения копирования, а также конструкторов перемещения и операторов назначения перемещения.

Объект любого класса, однозначно производного от некоторого базового класса, можно присвоить объекту этого базового класса. Обратный параметр не имеет значения true, так как существует неявное преобразование из производного класса в базовый класс, но не из базового класса в производный класс. Например:

// 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= для UserType2operator= предоставленного аргументаUserType1.

  • Вызывать функцию явного преобразования UserType1::operator UserType2, если такая функция существует.

  • Вызывать конструктор UserType2::UserType2, если он существует, принимает аргумент UserType1 и копирует результат.

Составное присваивание

Операторы составного назначения отображаются в таблице операторов назначения. Эти операторы имеют форму e1 op= e2, где e1 являетсяconst неизменяемым l-value и e2:

  • арифметический тип

  • указатель, если оп или +-

  • Тип, для которого существует соответствующая operator *op*= перегрузка для типа e1

Встроенная форма e1op= e2 ведет себя как e1 e1=ope2, но e1 вычисляется только один раз.

Составное присваивание перечисляемому типу создает сообщение об ошибке. Если левый операнд имеет тип указателя, правый операнд должен иметь тип указателя, или должно быть константным выражением, которое оценивается в 0. Если левый операнд имеет целочисленный тип, правый операнд не должен иметь тип указателя.

Результат встроенных операторов назначения

Встроенные операторы назначения возвращают значение объекта, указанного левым операндом после назначения (и арифметической/логической операции в случае составных операторов присваивания). Результирующий тип — это тип левого операнда. Результатом выражения присваивания всегда является l-значение. Эти операторы имеют ассоциативность справа налево. Левый операнд должен быть изменяемым l-значением.

В ANSI C результат выражения назначения не является l-значением. Это означает, что юридическое выражение (a += b) += c C++ не допускается в C.

См. также

Выражения с двоичными операторами
Встроенные операторы C++, приоритет и ассоциативность
Операторы назначения C