Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Rvalue и Lvalue  (Прочитано 10763 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LP
Помогающий

ru
Offline Offline

« : 13-01-2005 14:39 » 

Привет всем! У меня вопрос:
Допустим у нас есть переменная:
int i;
почему нельзя написать инструкцию:
++i++;
тогда как при
i++; или ++i;
все ОК.
И еще, почему
++i считается lvalue, i++ - rvalue? :?
Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 13-01-2005 20:30 » 

LP, ++i обозначает в С, что сначало производится прирашение переменной i, а затем вытаскивается значение с переменной. i++ обозначает, что сначало вытаскивается значение с переменной i, а затем происходит прирошение.
Пример:
1.
i=4;
m=++i;

здесь и m и i после выполнения будут равны 5.

2.
i=4;
m=i++;

здесь после выполнения m будет равно 4, а i будут равно 5.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 13-01-2005 20:58 » 

зато можно написать
(++i)++;
Улыбаюсь
Записан

npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-01-2005 09:14 » 

LP,

Привет всем! У меня вопрос:
Допустим у нас есть переменная:
int i;
почему нельзя написать инструкцию:
++i++;

Написать-то можно, только компилятор не будет такой код компилировать Улыбаюсь

Дело в том, что по правилам грамматики С++ это выражение будет разобрано как ++(i++)
Выражение в скобках порождает, как ты правильно заметил, rvalue, а инфиксный оператор ++ требует, чтобы аргумент был lvalue.

тогда как при
i++; или ++i;
все ОК.
И еще, почему
++i считается lvalue, i++ - rvalue? :?

Если по-простому, то lvalue -- это объект, в который можно сохранять информацию. Оператор инкремента (как инфиксный, так и постфиксный) требуют, чтобы их аргумент был lvalue -- ведь оператор изменяет свой аргумент, и это изменение надо куда-то сохранить.

Теперь перейдём к примеру.  Переменная i является lvalue, так как с ней связана некоторая постоянная (в рамках области видимости) ячейка памяти.  Поэтому к ней можно применять инкремент -- допустимы ++i и i++.

Выражение ++i работает так: значение переменной i увеличивается на 1, сохраняется в переменной и возвращается сама переменная.  Это объяснение, почему ++i даёт lvalue.

Выражение i++ работает иначе -- значение переменной i сохраняется во временной ячейке памяти, затем значение переменной i увеличивается на 1, сохраняется в переменной i, и возвращяется временный объект с прежним значением i. Временный объект не является хранилищем, которое предназначено для записи новых данных, это rvalue.  Вот ответ, почему i++ даёт rvalue.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 14-04-2006 20:39 » new

(коммент:)

FAQ (Rvalue и Lvalue )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines