Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > x++ и lvalue


Автор: nmn 19.7.2010, 12:02
здравсвтуйте

почему ++x является lvalue, а x++ нет?

Автор: djamshud 19.7.2010, 12:11
++x "возвращает себя".

Автор: mes 19.7.2010, 12:12
поиск поможет smile

Автор: azesmcar 19.7.2010, 13:16
префиксный возвращает ссылку, постфиксный - значение.

Я так понимаю FAQ никто не читает smile 
http://forum.vingrad.ru/forum/topic-269794/anchor-entry1981664/0.html

Автор: nmn 19.7.2010, 15:03
Цитата(azesmcar @  19.7.2010,  13:16 Найти цитируемый пост)
префиксный возвращает ссылку, постфиксный - значение

вот именно это я и спрашиваю, почему? почему сделано так?

Автор: azesmcar 19.7.2010, 15:06
Цитата(nmn @  19.7.2010,  15:03 Найти цитируемый пост)
вот именно это я и спрашиваю, почему? почему сделано так? 

а ты попробуй написать иначе.

Автор: SenkraD 19.7.2010, 15:46
azesmcar,  +1 - nmn попробуй по другому выполнить требование стандарта.
Даже если изделаеш как-то, то я бы за такое использование инкрементов/декрементов прибью при первом ревью:
Код
i-- = 45 + bar;
foo(i++ = 56);
Если я ошибся в использование, то покажите как вы хотите и для чего

Автор: nmn 19.7.2010, 21:12
хмм, что то все не то

попробуй иначе, стандарт... это все хорошо, вы скажите почему в стандарте ++x есть lvalue, а x++ - нет, какие для этого причины?

Автор: azesmcar 19.7.2010, 21:28
Цитата(nmn @  19.7.2010,  21:12 Найти цитируемый пост)
попробуй иначе, стандарт... это все хорошо, вы скажите почему в стандарте ++x есть lvalue, а x++ - нет, какие для этого причины? 

Я уже ответил, реализуй постфиксный оператор инкремента с возвращением ссылки тогда и поговорим.

Автор: bsa 20.7.2010, 12:17
Цитата(nmn @  19.7.2010,  22:12 Найти цитируемый пост)
попробуй иначе, стандарт... это все хорошо, вы скажите почему в стандарте ++x есть lvalue, а x++ - нет, какие для этого причины?

Ты хоть сам знаешь чем lvalue от rvalue отличается?

Автор: nmn 21.7.2010, 11:20
ну предположим знаю, и что?

Автор: semibug 24.7.2010, 02:24
Действительно, для чего это ограничение? C/C++ всегда были либеральными языками, а тут нельзя и все.
Можно было бы записать:
Код

volatile int x;
x++ = 0;

вместо
Код

volatile int x;
x = 0;
x++;


Автор: Artemon 24.7.2010, 20:00
Цитата

volatile int x;
x++ = 0;


x++ это rvalue

Тебеже в голову не приходит написать:
1=25




Автор: semibug 26.7.2010, 11:15
Artemon, я и не пишу 1 = 25.
Смысл
Код

volatile int x;
x++ = 0;

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



Автор: azesmcar 26.7.2010, 11:20
Цитата(semibug @  26.7.2010,  11:15 Найти цитируемый пост)
что сначала присвоить переменной x ноль, затем увеличить на один.

это делается вот так
Код

(i = 0)++

а ты делаешь наоборот, и вообще лучше вместо этого извращения сразу сделать
Код

i = 1;


и я уже устал отвечать для чего это ограничение...

Автор: semibug 26.7.2010, 11:21
azesmcar, где то я пропустил. кинь ссылку пожалуйста, в чем смысл этого ограничения?

Автор: azesmcar 26.7.2010, 11:34
Цитата(semibug @  26.7.2010,  11:21 Найти цитируемый пост)
azesmcar, где то я пропустил. кинь ссылку пожалуйста, в чем смысл этого ограничения? 

чуть выше я писал
Цитата(azesmcar @  19.7.2010,  21:28 Найти цитируемый пост)
Цитата(nmn @  19.7.2010,  21:12 Найти цитируемый пост)
попробуй иначе, стандарт... это все хорошо, вы скажите почему в стандарте ++x есть lvalue, а x++ - нет, какие для этого причины? 

Я уже ответил, реализуй постфиксный оператор инкремента с возвращением ссылки тогда и поговорим. 


реализуем
Код

// префиксный - должен изменять и возвращать измененное значение
int& prefix(int& i) {
   i += 1; // изменяем значение
   return i; // возвращаем измененное значение
}
// постфиксный - должен изменять, но возвращать текущее значение
int postfix(int& i) {
   int temp = i; // сохраняем текущее значение
   i += 1; // изменяем значение
   return temp; // возвращаем сохраненное текущее значение
}

теперь попробуй реализовать постфиксный иначе, чтобы возвращал ссылку. В первую очередь подумай о том, на что он будет возвращать ссылку?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)