Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
#1

Почему i++ это rvalue, а ++i lvalue? - C++

10.03.2013, 12:35. Просмотров 948. Ответов 5
Метки нет (Все метки)

Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии? Если можно, то лучше покажите реализацию постинкремента и преинкремента.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 12:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему i++ это rvalue, а ++i lvalue? (C++):

Rvalue и lvalue ссылки - C++
Здравствуйте, что расскажите, пожалуйста что такое lvalue и rvalue ссылки и с чем их едят, где можно использовать, и чем отличается...

Что такое rvalue и lvalue - C++
как понимать эти штуки?

Семантика перемещения rvalue\lvalue ссылок - C++
Здравствуйте форумчани. Объясните пожалуйста процессы происходящии внутрии функции swap принимающую rvalue аргументы: Код программы:...

Нюансы синтаксиса и семантики: что такое rvalue и lvalue? - C++
Добрый день, всем. Ребят, помогите разобраться в rvalue и lvalue. Читал об этом много чего, но все таки не понимаю, почему этому уделяется...

Почему *(a+j) не rvalue? - C++
Запись массива вида a - это lvalue и эквивалентна *(a+j), но почему *(a+j) не rvalue, потому что сумма a+j должна была бы быть rvalue, но...

Lvalue required почему высвечивается такая ошибка? - C++
#include <stdio.h> #include <conio.h> #include <iostream.h> void CutLeft(int x_min,int y_min,int x_max,int y_max, const int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13139 / 7402 / 829
Регистрация: 27.09.2012
Сообщений: 18,243
Записей в блоге: 3
Завершенные тесты: 1
10.03.2013, 12:45 #2
Цитата Сообщение от mzarb Посмотреть сообщение
Если можно, то лучше покажите реализацию постинкремента и преинкремента.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class  MYSUPERPUPERINTEGER{
    int data;
public:
    MYSUPERPUPERINTEGER(int x=0):data(x){};
    int GetX(){return data;};
    MYSUPERPUPERINTEGER & operator++(){
        this->data+=1;
        return *this;
    }
    MYSUPERPUPERINTEGER operator++(int){
        int x=this->data;
        this->data+=1;
        return MYSUPERPUPERINTEGER(x);
    }
};
 
int main(){
    MYSUPERPUPERINTEGER a;
    std::cout<<(a++).GetX()<<std::endl;
    std::cout<<(++a).GetX()<<std::endl;
}
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
10.03.2013, 13:08  [ТС] #3
Croessmah, Спасибо, принцип понятен. И ещё, в 15 строчке создался объект без имени? Получается, что постинкремент это rvalue, потому что если поставить его слева, то значение присвоится временному объекту, который разрушится после выхода из точки следования?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
10.03.2013, 13:12 #4
Цитата Сообщение от mzarb Посмотреть сообщение
Встречал упоминания что для постинкремента создается временная копия, но дальше не объясняется. Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
Примерно так. Дело именно в том, что копия временная, существует только на время вычисления утверждения, содержащего постинкремент, и не является полноценным объектом (у неё нет имени; к ней нельзя обратиться в другой части утверждения, только непосредственно как к результату постинкремента, но не самостоятельному значению). Тогда как переменная, которую увеличивает преинкремент, таким объектом является. В этом и разница между rvalue и lvalue и причина, по которой результат постинкремента получает характеристику rvalue.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 13:20 #5
Цитата Сообщение от mzarb Посмотреть сообщение
Получается, что переменной с преинкрементом можно присвоить значение, потому как возвращается её адрес, а для постинкремента адрес временной копии?
При постинкременте: создаётся временна копия переменной, потом значение переменной увеличивается, возвращается сохранённое во временной копии старое значение. При преинкременте: увеличивается значение переменной, возвращается новое значение. Как-то так...
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.03.2013, 14:20 #6
Цитата Сообщение от alsav22 Посмотреть сообщение
При преинкременте: увеличивается значение переменной, возвращается новое значение.
Для данного сабжа важно именно то, что возвращается не значение, а ссылка на оригинальный объект, через которую и можно получить желаемое значение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 14:20
Привет! Вот еще темы с ответами:

Почему оператор сложения двух временных объектов возвращает lvalue ссылку? - C++
Допустим есть класс: class A { public: A() {} A(const A&amp;) { cout &lt;&lt; &quot;A(const A&amp;)\n&quot;; } A(A&amp;&amp;) { cout &lt;&lt;...

Lvalue и rvalue - C++
Какая выгода использования rvalue? Допустим есть такой класс class A { public: A() = default; void setName(const...

Значения Lvalue и Rvalue - C++
Здравствуйте. В данной ссылке https://msdn.microsoft.com/ru-ru/library/f90831hc.aspx приведен пример int main() { int...

rvalue - C++
добрый вечер. интересно ваше мнение. значит ли появление rvalue reference в новом стандарте то, что теперь локальным объектам зеленый свет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.03.2013, 14:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru