Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос из книги Страуструпа 
:(
    Опции темы
mes
Дата 11.10.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  11.10.2009,  12:29 Найти цитируемый пост)
Поэтому мне и не понятно, почему это Страуструп объект стоящий справа, а не слева называет lvalue ?!

lvalue не обязательно должен стоять физически слева.
например int а, b; a = b;  // а и b lvalue несмотря на то что одно стоит слева другое справа.
если точнее, то  в данном примере справа в роли rvalue выступает lvalue b;
подобно как например в русском языке имя прилагательное может переходить в разряд имен существительных :
больной (прил) человек  и  больной (сущ).
так и в программировании выражение одной сути может исполнять роль другой.

Это сообщение отредактировал(а) mes - 11.10.2009, 14:01


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 11.10.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Кажется начал понимать, прошу проверить ход мыслей до вывода ;)

Ввиду того что с любым выражением как-то должно связано либо адрес со значением по этому адресу, либо просто значение. То хочется различать просто значение от значения по адресу, поэтому и обозначили значение лежащее по адресу как lvalue. Наскоко понял из статьи что у меня в P.S.: из прошлого поста, то первоначально это и обозначало объект стоящий слева от присваивания, а сейчас компиллеры стали круче и потому уже не актуально )
Из той же статьи, что в P.S.:
Цитата

char a [10];

i      —   lvalue
++i    —   lvalue
*&i    —   lvalue
a[5]   —   lvalue
a[i]   —   lvalue

однако:

10     —   rvalue
i + 1  —   rvalue
i++    —   rvalue


не понятно, почему последнее i++ написано rvalue ? Попробую представить как i += 1 и вроде как понятно, что такое не может быть lvalue , т.е. в такое мы не можем кинуть значение, но почему тогда ++i является lvalue ? ведь посути это можно писать как result = (i+=1,i); в такое тоже сложно представить чтобы чтото писать ?! ;)

Это сообщение отредактировал(а) EvilsInterrupt - 11.10.2009, 14:14
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 11.10.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  11.10.2009,  13:11 Найти цитируемый пост)
но почему тогда ++i является lvalue ?

потому что возвращают разное :
Код

int post_increment(int & i)
{
   int old =  i;
   i+=1;
   return old; // возвращает временное значение
}

int & prefix_increment (int & i)
{  
   i+=1;
   return i; // возвращает оригинал по ссылке
}


Это сообщение отредактировал(а) mes - 11.10.2009, 14:22


--------------------
PM MAIL WWW   Вверх
mes
Дата 11.10.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  11.10.2009,  13:11 Найти цитируемый пост)
а сейчас компиллеры стали круче и потому уже не актуально )

при чем тут мощность компиляторов я не понял smile


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 11.10.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



mes, ну к тому, что раньше lvalue применялось исключительно к объектам слева от присваивания и только им ;) Так по крайней мере баит дядя Бьярни )
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 11.10.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(EvilsInterrupt @  11.10.2009,  14:18 Найти цитируемый пост)
ну к тому, что раньше lvalue применялось исключительно к объектам слева от присваивания и только им ;)

это  с мощностью компилятора никак не связано...smile


--------------------
PM MAIL WWW   Вверх
xvr
Дата 11.10.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



lvalue это не то, что СТОИТ слева от оператора присваивания, а то, что МОЖЕТ стоять слева, т.е. то, чему можно присвоить. Это так же означает, что у этих объектов можно взять адрес, т.е. они представляют некую сущность, существующую не только в процессе вычисления выражения.
Тут int * p = &(x>y ? x : y); x и y представляют собой такие сущности (это переменные), у них можно взять адрес и им можно присвоить. Т.е. результат всего оператора ? будет являться lvalue, и от него можно взять адрес.
Если же мы рассмотрим такое выражение int * p = &(x>y ? x+y : y);, то x+y не является lvalue, т.к. это значение существует только внутри выражения, и недоступно как отдельный объект. У него нет адреса, который можно было бы взять, и оператор ? не будет lvalue.

Заметим, что если бы x и y были объектами для которых был бы перегружен оператор +, как возвращающий lvalue (например ссылку), то оператор ? снова стал бы lvalue (за что С++ иногда и критикуют  smile )


PM MAIL   Вверх
stat007
Дата 11.10.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 521
Регистрация: 9.10.2008

Репутация: -2
Всего: -4



shuttle, Лучше читай Страуструпа - 3-е издание... Там всё более понятнее...
PM MAIL   Вверх
bsa
Дата 12.10.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Лучше Страуструпа вообще не читать, пока не станешь разбираться в С++. Сначала надо изучить С++, затем прочитать Мейерса и Александреску, а потом уже можно и за "Страуса" браться...
PM   Вверх
zim22
Дата 12.10.2009, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(bsa @  12.10.2009,  10:21 Найти цитируемый пост)
+, затем прочитать Мейерса и Александреску, а потом уже можно и за "Страуса" браться...

bsa, не соглашусь. я сейчас читаю Страуструпа - ничего там сложного нет. главное - вдумчиво читать smile
(Страуструп - это моя вторая книга по С++. Первую прочитал Стенли Липпман "Язык программирования С++. Вводный курс. 4 издание")
Александреску гораздо сложней для понимания.

Это сообщение отредактировал(а) zim22 - 12.10.2009, 10:37


--------------------
PM MAIL   Вверх
bsa
Дата 12.10.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, это не мое мнение. Но знающие люди утверждают, что страус может сбить с пути истинного неокрепший ум новичка. Поэтому прежде чем его читать, нужно знать, что есть хорошо, а что плохо.
PM   Вверх
zim22
Дата 15.10.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Сегодня натолкнулся на один абзац текста, правдивость которого поставил под сомнения.
Действительно ли в нижеприведённом коде преобразования типов не разрешаются?

Код

template <class C>
int get_nth(C &p, int n); // получение n-го элемента

Цитата

Предположительно эта функция возвращает значение n-го элемента контейнера типа C. Т.к. С должен быть выведен по фактическому аргументу в вызове get_nth(), преобразования типов для первого аргумента не разрешаются. Однако второй аргумент является совершенно обычным, поэтому рассматривается полный диапазон возможных преобразований. Например:

Код

class Index {
public:
  operator int();
};

void f(vector<int> &v, short s, Index i) {
  int i1 = get_nth<int>(v, 2); // точное совпадение
  int i2 = get_nth<int>(v, s); // стандартное преобразование short в int
  int i1 = get_nth<int>(v, i); // преобразование Index в int, определяемое пользователем
}

***
zim22: Но если немножко изменить функции, то будет вызвано преобразование из Index в int для первого аргумента функции.
Код

template <class C>
int get_nth(const C &p, int n); 

void f(short s, Index i) {
  int i1 = get_nth<int>(i, s); // вызывается функция с аргументами (const int&, int)
}



--------------------
PM MAIL   Вверх
bsa
Дата 18.10.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, вот тебе и ответ, почему новичкам читать его не следует.
PM   Вверх
zim22
Дата 19.10.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



прочитав ещё пару страниц - снова споткнулся на непонятную мне ошибку. отложу Страуструпа до лучших времён smile


--------------------
PM MAIL   Вверх
EvilsInterrupt
Дата 11.12.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Возник вопрос, прошу пояснить ;) 
Есть код из книги Страуструпа:

Код

map<string, int> histogram;

void record(const string & s)
{
  histogram[s]++;
}


Мне непонятно что именно инкрементируется ?

Предположения:
1)
Тот int что был указан в создании гистограммы и строку поместили в мап и ассоциированный с нею инт инкрементируется ?
2)
Каждому объекту не явно задается какой-то инт и его можно инкрементировать ?

попутный доп. вопрос:
при создании в мапе создается исключительно один инт и одна стринг, или в довесок еще доп. инт, так сказать служебный куда помещается хэш или еще чтото в этом роде ?

ЗЫ:
сорри, в сорцах заблудился и пока знаний маловато чтобы подобного рода вещи узнавать )

Это сообщение отредактировал(а) EvilsInterrupt - 11.12.2009, 21:46
PM MAIL WWW ICQ Jabber   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.