Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по С++.doc
Скачиваний:
51
Добавлен:
02.05.2014
Размер:
995.33 Кб
Скачать

R.5.17 Операции присваивания

Существует несколько операций присваивания, все они выполняются справа налево. Для всех них требуется, чтобы левым операндом был изменяемый адрес. Тип выражения присваивания совпадает с типом левого операнда. Результат операции присваивание - значение, хранящееся в левом операнде после того как произошло присваивание. Результат является адресом. выражение-присваивания: выражение-условия унарное-выражение операция-присваивания выражение-присваивания операция-присваивания: один из = *= /= %= += -= >>= <<= &= ^= |= При простом присваивании (=) значение выражения заменяет собой значение объекта, с которым сопоставляется левый операнд. Если оба операнда арифметического типа, правый операнд, прежде чем произойдет присваивание, преобразуется к типу левого операнда. Неявные преобразования к типу перечисления ($$R.7.2) не производятся, поэтому если левый операнд имеет тип перечисления, правый операнд должен быть таким же. Если левый операнд имеет тип указателя, правый операнд должен быть типа указателя или выражением-константой, дающим результат 0. Правый операнд преобразуется к типу левого операнда, прежде выполнения присваивания. Указатель типа T* const можно присваивать указателю типа T*, но обратное присваивание считается незаконным ($$R.7.1.6). Объекты типа const T или volatile T можно присваивать по адресу типа T или volatile T (см. так же $$R.8.4). Если левый операнд имеет тип указателя на член, правый операнд должен быть типа указатель на член или выражением-константой, дающим результат 0; перед присваиванием правый операнд преобразуется к типу левого операнда. Присваивание объектам класса X ($$R.9) задается функцией X::operator=() ($$R.13.4.3). Если пользователь не определил свою функцию X::operator=(), для присваивания используется стандартный вариант ($$R.12.8). Отсюда следует, что объект класса, который является прямым или непрямым производным от X, и однозначно описан как производный в части public ($$R.4.6), можно присвоить объекту X. Указатель на член класса B можно присваивать указателю на член того же типа класса D при условии, что D является прямым или непрямым производным класса B, и однозначно описан как производный в части public ($$R.10.1.1). Присваивание объекту типа "ссылка на T" сводится к присваиванию объекту типа T, который обозначается ссылкой. Выполнение выражение вида E1 op= E2 эквивалентно выполнению E1 = E1 op (E2), однако E1 вычисляется лишь один раз. В операциях += и -= левый операнд может быть указателем, в этом случае правый (целочисленный) операнд преобразуется так, как объяснялось в $$R.5.7. Все правые операнды и все левые операнды, не являющиеся ссылками, должны быть арифметического типа. Для объектов класса присваивание в общем случае не совпадает с инициализацией ($$R.8.4, $$R.12.1, $$R.12.6, $$R.12.8).

R.5.18 Операция запятая

Операции запятая выполняются слева направо. выражение: выражение-присваивания выражение, выражение-присваивания Пара выражений, разделенных запятой, вычисляется слева направо и значение левого выражения уничтожается. Все побочные эффекты вычисления левого выражения могут возникать до вычисления правого выражения. Тип и значение результата совпадают с типом и значением правого выражения. Результат является адресом, если таковым является правое выражение. В контекстах, где запятая имеет специальное значение, скажем в списке фактических параметров функции ($$R.5.2.2) или в списке инициализаторов ($$R.8.4), описанная здесь операция запятая может появляться только в скобках, например, вызов функции f(a, (t=3,t+2), c); содержит три параметра, причем второй имеет значение 5.