Что возвращает оператор присваивания c
Что возвращает оператор присваивания c
Увидел вопрос:
>31. Какой результат должны возвращать операции с присваиванием?
Что-то я в стандарте ничего про долженствование не нахожу. Какой ответ правильный? Или это вопрос поставлен не правильно?
| От: | XuMuK |
Дата: | 23.09.11 13:10 | |
Оценка: |
Здравствуйте, B0FEE664, Вы писали:
BFE>Увидел вопрос:
>>31. Какой результат должны возвращать операции с присваиванием?
BFE>Что-то я в стандарте ничего про долженствование не нахожу. Какой ответ правильный? Или это вопрос поставлен не правильно?
ссылку на измененный объект.
| От: | B0FEE664 |
Дата: | 23.09.11 13:14 | |
Оценка: |
Здравствуйте, XuMuK, Вы писали:
BFE>>Что-то я в стандарте ничего про долженствование не нахожу. Какой ответ правильный? Или это вопрос поставлен не правильно?
XMK>ссылку на измененный объект.
| От: | uzhas |
Дата: | 23.09.11 14:18 | |
Оценка: |
5.17 Assignment operators [expr.ass]
1. There are several assignment operators, all of which group right-to-left. All require a modifiable lvalue as
their left operand, and the type of an assignment expression is that of its left operand. The result of the
assignment operation is the value stored in the left operand after the assignment has taken place; the result
is an lvalue.
3. If the left operand is not of class type, the expression is implicitly converted (clause 4) to the cv-unqualified
type of the left operand.
4. If the left operand is of class type, the class shall be complete. Assignment to objects of a class is defined
by the copy assignment operator (12.8, 13.5.3).
12.8 Copying class objects
A user-declared copy assignment operator X::operator= is a non-static non-template member function
of class X with exactly one parameter of type X, X&, const X&, volatile X& or const volatile
X&.109) [Note: an overloaded assignment operator must be declared to have only one parameter; see 13.5.3.
] [Note: more than one form of copy assignment operator may be declared for a class. ] [Note: if a class X
only has a copy assignment operator with a parameter of type X&, an expression of type const X cannot be
assigned to an object of type X. [Example:
struct X <
X();
X& operator=(X&);
>;
const X cx;
X x;
void f() <
x = cx; // error:
// X::operator=(X&) cannot assign cx into x
>
—end example] —end note]
10 If the class definition does not explicitly declare a copy assignment operator, one is declared implicitly.
The implicitly-declared copy assignment operator for a class X will have the form
X& X::operator=(const X&)
| От: | B0FEE664 |
Дата: | 23.09.11 15:47 | |
Оценка: |
Не согласен. «про меня» там ничего не написано Вот оригинальный вопрос:
>31. Какой результат должны возвращать операции с присваиванием?
Если бы вопрос звучал так:
— Какой результат могут возвращать операции с присваиванием?
— Какой результат следует возвращать при перегрузке оператора присваивания? Зачем?
— Какой результат принято возвращать при перегрузке оператора присваивания?
тогда понятно, что отвечать. А так —
U>стандарт не обязывает вас возвращать именно это из оператора присваивания. можете void вернуть
спасибо, это я и хотел узнать.
| От: | rus blood |
Дата: | 23.09.11 16:53 | |
Оценка: | +1 |
Здравствуйте, B0FEE664, Вы писали:
U>>стандарт не обязывает вас возвращать именно это из оператора присваивания. можете void вернуть
BFE>спасибо, это я и хотел узнать.
Не сможешь использовать конструкции вида
a=b=c;
Впрочем, а нафиг они нужны?
| От: | Sir-G |
Дата: | 23.09.11 18:26 | |
Оценка: | +1 |
| От: | sraider | http://dvinogradov.blogspot.com |
Дата: | 24.09.11 14:05 | ||
Оценка: |
RB>>Впрочем, а нафиг они нужны?
SG>По-моему тоже не нужны, лучше писать каждое присваивание на отдельной строке, понятнее. =)
много других вариантов использования, например f(a=b)
кстати не раз замечал мысль заменять
| От: | Sir-G |
Дата: | 25.09.11 08:44 | |
Оценка: | +1 |
| От: | Sir-G |
Дата: | 25.09.11 08:52 | |
Оценка: | +1 |
| От: | B0FEE664 |
Дата: | 26.09.11 12:20 | |
Оценка: | +1 |
Для таких вариантов использования придётся ещё один оператор добавлять. Ваш Кэп.
Что возвращает оператор присваивания c
Как я учился программировать на С++
Примеры решения задач
Резюме
Контрольные вопросы
Задачи для самостоятельного решения
Результат выражения является тем значением, которое возвращает оператор присваивания. Поэтому помимо обычных присваиваний вида n = 5 допускается многократное использование оператора присваивания в выражениях.
Например, вполне законной является инструкция вида x = y = z = 3, в результате выполнения которой переменным x, y и z присваивается значение 3.
Инструкции могут быть и более замысловатыми. В листинге 1.6 целочисленным переменным n и m командой n = (m = 6) + 3 присваиваются значения 9 и 6 соответственно.
==========> Листинг 1.6 Оператор присваивания
#include
using namespace std;
int main()<
int n,m;
n=(m=6)+3;
cout ==========> Конец Листинга 1.6 Компилированный исполняемый файл листинга 1.6(120Кб, rar)
В соответствии с приведенной командой сначала вычисляется выражение m=6, значением которого является 6, и при этом такое же значение присваивается переменной m. Далее к этому значению прибавляется число 3 и результат присваивается переменной n.
Результат такой операции существенно зависит от того, из какого в какой тип данных осуществляется преобразование. В некоторых случаях может иметь место потеря данных: например, если переменной типа int присваивается значение переменной типа double, как в листинге 1.7
==========> Листинг 1.7(См. примечание) Автоматическое преобразование типов при присваивании значения
В программе объявляется целочисленная переменная a типа int и инициализируется переменная x типа double со значением 3.5. Далее в программе переменной a в качестве значения присваивается переменная x. В данном случае речь идет о том, что переменной типа int присваивается значение типа double. Поскольку диапазон значений для типа double шире диапазона значений для типа int, происходит урезание значения
В частности, при присваивании отбрасывается дробная часть числа, и переменная a получает значение 3
Если бы переменной типа double присваивалось значение типа int, таких проблем не возникало бы.
Преобразование типов может проявляться и совершенно по-иному. В листинге 1.8 приведен пример кода программы, в которой типа char присваивается значение типа int.
==========> Листинг 1.8 Преобразование int-типа в char-тип.
Целочисленной переменной n типа int присваивается значение 68. Далее эта переменная присваивается в качестве значения переменной x char-типа. В результате автоматического преобразования типов переменная х, в соответствии с кодовой таблицей, получает символьное значение D. В этом же программном коде проиллюстрирована обратная процедура: командой z=’D’ целочисленной переменной z присваивается в качестве значения символ D. В результате автоматического преобразования символов этой переменной на самом деле будет присвоен целочисленный код символа в кодовой таблице(значение 68).
Справочник по C#. Операторы присваивания
Оператор присваивания = назначает значение расположенного в правой части операнда переменной, свойству или элементу индексатора, которые указаны в операнде слева. Результатом выражения присваивания является значение, назначенное расположенному слева операнду. Расположенный справа операнд должен иметь тот же тип, что и операнд слева, либо же допускать неявное преобразование в этот тип.
Оператор присваивания = имеет правую ассоциативность, то есть выражение формы:
В следующем примере показано использование оператора присваивания с локальной переменной, свойством и элементом индексатора в качестве левого операнда:
Ссылочный оператор присваивания
При использовании ссылочного оператора присваивания тип левого и правого операндов должен быть одинаковым.
Составное присваивание
Для бинарного оператора op выражение составного присваивания в форме
за исключением того, что x вычисляется только один раз.
Присваивание объединения со значением NULL
Возможность перегрузки оператора
Пользовательский тип не может перегружать оператор присваивания. Однако пользовательский тип может определять неявное преобразование в другой тип. Таким образом, значение пользовательского типа может быть присвоено переменной, свойству или элементу индексатора другого типа. Дополнительные сведения см. в разделе Операторы пользовательского преобразования.
Спецификация языка C#
Подробные сведения см. в разделе Assignment operators (Операторы присваивания) в спецификации языка C#.
См. сведения о ссылочном операторе присваивания = ref в примечании к функциям.
Операторы присваивания
Синтаксис
выражениеоператора присваивания выражения
assignment-operator: один из следующих операторов:
= *= /= %= += -= >>= &= ^= |=
Remarks
Операторы присваивания хранят значение в объекте, указанном левым операндом. Существует два вида операций присваивания:
простое присваивание, в котором значение второго операнда хранится в объекте, указанном первым операндом.
составное присваивание, в котором выполняется арифметическая операция сдвига или Побитовая перед сохранением результата.
Все операторы присваивания в следующей таблице, за исключением = оператора, являются составными операторами присваивания.
Таблица операторов присваивания
Оператор | Значение |
---|---|
= | Сохранение значения второго операнда в объект, указанный первым операндом (простое присваивание). |
*= | Умножение значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
/= | Деление значения первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
%= | деление по модулю первого операнда на значение второго операнда; сохранение результата в объект, указанный первым операндом. |
+= | Сложение значения первого операнда со значением второго операнда; сохранение результата в объект, указанный первым операндом. |
-= | Вычитание значения второго операнда из значения первого операнда; сохранение результата в объект, указанный первым операндом. |
Сдвиг значения первого операнда влево на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом. | |
>>= | Сдвиг значения первого операнда вправо на количество битов, заданное значением второго операнда; сохранение результата в объект, указанный первым операндом. |
&= | Выполнение операции побитового И для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
^= | Выполнение операции побитового исключающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
|= | Выполнение операции побитового включающего ИЛИ для значений первого и второго операндов; сохранение результата в объект, указанный первым операндом. |
Ключевые слова операторов
Три составных оператора присваивания имеют эквиваленты ключевого слова. К ним относятся:
Оператор | Эквивалентный |
---|---|
&= | and_eq |
|= | or_eq |
^= | xor_eq |
Пример
Простое присваивание
Оператор простого присваивания ( = ) вызывает сохранение значения второго операнда в объекте, указанном первым операндом. Если оба объекта имеют арифметические типы, правый операнд преобразуется в тип слева перед сохранением значения.
Объект любого класса, однозначно производного от некоторого базового класса, можно присвоить объекту этого базового класса. Обратный переход не выполняется, поскольку существует неявное преобразование из производного класса в базовый класс, но не из базового класса в производный класс. Пример:
Присваивание ссылочным типам выполняется так, как если бы выполнялось присваивание объекту, на который указывает ссылка.
Для объектов типа класса присваивание отличается от инициализации. Для иллюстрации того, насколько сильно присваивание может отличаться от инициализации, рассмотрим код
может вызывать одно из указанных ниже действий.
Составное присваивание
Составные операторы присваивания показаны в таблице операторы назначения. Эти операторы имеют форму E1Op E2, где E1 — это неизменяемое l-значение, а E2 —:
указатель, если Op имеет значение или —
Форма E1Op E2 ведет себя как E1 E1OpE2, но E1 вычисляется только один раз.
Составное присваивание перечисляемому типу создает сообщение об ошибке. Если левый операнд имеет тип указателя, правый операнд должен иметь тип указателя или константное выражение, результатом которого является 0. Если левый операнд имеет целочисленный тип, правый операнд не должен иметь тип указателя.
Результат операторов присваивания
Операторы присваивания возвращают значение объекта, указанного левым операндом после присваивания. Результирующий тип — это тип левого операнда. Результатом выражения присваивания всегда является l-значение. Эти операторы имеют ассоциативность справа налево. Левый операнд должен быть изменяемым l-значением.
В ANSI C результат выражения присваивания не является l-значением. Это означает, что юридическое выражение C++ (a += b) += c не допускается в C.
Операторы назначения в C
Операция присваивания заключается в том, что значение правого операнда присваивается месту хранения, имя которого обозначено левым операндом. Поэтому левый операнд в операции присваивания должен иметь изменяемое l-значение. После того как присваивание выполнено, выражение присваивания имеет значение левого операнда, но не l-значение.
Синтаксис
assignment-expression :
conditional-expression
unary-expression assignment-operator assignment-expression
assignment-operator : один из следующих символов:
= *= /= %= += -= >>= &= ^= |=
Операторы присваивания в языке C позволяют в ходе одной операции выполнить и преобразование, и присваивание значения. В языке C имеются следующие операторы присваивания:
Оператор | Выполняемая операция |
---|---|
= | Простое присваивание |
*= | Присваивание умножения |
/= | Присваивание деления |
%= | Присваивание остатка |
+= | Присваивание сложения |
-= | Присваивание вычитания |
Присваивание сдвига влево | |
>>= | Присваивание сдвига вправо |
&= | Присваивание побитового И |
^= | Присваивание побитового исключающего ИЛИ |
|= | Присваивание побитового включающего ИЛИ |
В ходе присваивания тип значения в правой части преобразуется в тип значения в левой части, а после выполнения операции значение сохраняется в левом операнде. Левый операнд не должен быть массивом, функцией или константой. Путь преобразования, который зависит от двух типов, подробнее описывается в разделе Преобразования типов.