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

Поиск:

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


depict1
****


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

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



Цитата(mes @  17.6.2009,  14:37 Найти цитируемый пост)
чего то захотелось вспомнить молодость

видать в молодости вы тоже ошибки делали smile
попробуйте операцию умножить сделать.
***
в класс добавил конструктор. почему компилятор не ругается? ведь ссылка (op_t operation) должна быть инициализирована.
иначе при её вызове получим runtime error.
Код

struct op_meta_t
{
  op_meta_t() {}
    unsigned char key;
    std::string name;
    op_t operation;
};

***
в GCC ругается! а вот Студия молчит.

Это сообщение отредактировал(а) zim22 - 17.6.2009, 15:18


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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(zim22 @  17.6.2009,  15:11 Найти цитируемый пост)
в GCC ругается! а вот Студия молчит.

очередная ошибка студии...
PM   Вверх
mes
Дата 17.6.2009, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zim22 @  17.6.2009,  14:11 Найти цитируемый пост)
видать в молодости вы тоже ошибки делали smile
попробуйте операцию умножить сделать.

ага .. как же без них..  else лишнее.. по запарке добавил smile 


Это сообщение отредактировал(а) mes - 17.6.2009, 15:45


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


uploading...
****


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

Репутация: 52
Всего: 211



Цитата

There shall be no references to references, no arrays of references, and no pointers to references. The declaration
of a reference shall contain an initializer (8.5.3) except when the declaration contains an explicit
extern specifier (7.1.1), is a class member (9.2) declaration within a class declaration, or is the declaration
of a parameter or a return type (8.3.5); see 3.1. A reference shall be initialized to refer to a valid object
or function.

Код

typedef int (&op_t) (int, int);

struct v
{
    op_t t;
};

int main ()
{
    v q;
    q.t(1, 2);
}

это работает..ну как сказать работает smile вылетает с ошибкой, но компилируется.

Добавлено через 1 минуту и 14 секунд
если заменить на int& - орет нечеловеческим голосом, а вот с функциями - молчит как партизан smile 
PM   Вверх
andrew_121
Дата 17.6.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

Репутация: 10
Всего: 33



azesmcar, Какой компилятор?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 17.6.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 52
Всего: 211



Цитата(andrew_121 @  17.6.2009,  16:08 Найти цитируемый пост)
azesmcar, Какой компилятор? 

VS2008 Professional
PM   Вверх
andrew_121
Дата 17.6.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

Репутация: 10
Всего: 33



Я так и думал. Жаль не могу сам проверить сей факт.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 18.6.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



думаю сюда вопрос напишу, т.к. это вопрос и он из книги Страуструпа smile
***
В книге написано, что:
Цитата

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

И приводится пример кода:
Код

class S;
S* h(S*);

void k(S* p) {
  S a; // ошибка: S не определён, а для выделения памяти требуется знать его размер
  S* q = h(p); // правильно - указатель можно передавать и разместить  
}

так вот, где "правильно" написано - оно не правильно. Линкер ругается на  unresolved external symbol
или Страуструп имел ввиду правильность с точки зрения компилятора, а не линкера?


Это сообщение отредактировал(а) zim22 - 18.6.2009, 18:19


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


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


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

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



Цитата(zim22 @  18.6.2009,  17:18 Найти цитируемый пост)
так вот, где "правильно" написано - оно не правильно. Линкер ругается на  unresolved external symbol
или Страуструп имел ввиду правильность с точки зрения компилятора, а не линкера?

Имел ввиду что где то в дальнейшем тело функции будет написано. Но не написал, так как само тело не относится к обсуждаемому вопросу . smile

Цитата(zim22 @  18.6.2009,  17:18 Найти цитируемый пост)
Именем типа структуры можно пользоваться до определения типа, пока не требуется знания имен членов или размера структуры.

никаких ошибок связанных с этой цитатой в коде нет smile



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


Executables research
***


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

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



У меня есть два вопроса относительно того, что поясняет в своей книге Страуструп.

Вопрос №1:
В 6.2 "Обзор операторов" на странице 163, он приводит код:
Код

int * pp = &(x > y ? x : y); // адрес целого с большим значением

и ниже текст:
Цитата

Если и второй, и третий операнды оператора ?: являются lvalue и имеют одинаковый тип, результат имеет тот же тип и является lvalue.


Не совсем понимаю, как может то что справа быть lvalue-ем ? Ведь lvalue это то куда присваивают значение?!

Вопрос №2:
Рядышком, на следующей 164 страничке в Главе 6. Выражения и инструкции. Есть код:
Код

int i = 1;
v[i] = i++; // результат не определен

и слова:
Код

может вычисляться либо как v[1] = 1 либо как v[2] = 1, либо привести к еще более странным странным результатам.

Не совсем понимаю эту "неопределенность" .  возникнуть чтото отличное от v[1] = 1; ? Хоть один компиллер назовите, который генерит такую вот неопределеность ?
PM MAIL WWW ICQ Jabber   Вверх
GoldFinch
Дата 11.10.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 6
Всего: 26



EvilsInterrupt, может произойти
Код

t=i;
v[i] = t;
++i;
а может
Код

t=i;
++i;
v[i] = t;


Добавлено через 1 минуту и 16 секунд
EvilsInterrupt, lvalue - Это то что может быть слева. это не запрещает ему при это быть и rvalue
PM MAIL ICQ   Вверх
EvilsInterrupt
Дата 11.10.2009, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


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

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



GoldFinch, я привык видеть конкретный код! Назови плиз хоть один компиллер, который генерит подобное ?
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 11.10.2009, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(EvilsInterrupt @  11.10.2009,  00:09 Найти цитируемый пост)
Назови плиз хоть один компиллер, который генерит подобное ? 

например gcc  в основном так и поступает, в отличии от студии которая (по крайней мере при стандартных настройках) более дружественная к пользователю, и старается предугать как поступить.

Цитата(EvilsInterrupt @  10.10.2009,  23:50 Найти цитируемый пост)
Не совсем понимаю, как может то что справа быть lvalue-ем ? Ведь lvalue это то куда присваивают значение?!

Код

int a = 4;
int b = 5;

(true? a : b)=15;
std::cout << a << " " << b << std:: endl;

(!true? a : b)=25;
std::cout << a << " " << b << std:: endl;



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


depict1
****


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

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



Цитата(EvilsInterrupt @  11.10.2009,  00:50 Найти цитируемый пост)
Не совсем понимаю, как может то что справа быть lvalue-ем ? Ведь lvalue это то куда присваивают значение?!

очень просто определить, является ли объект lvalue или rvalue
достаточно попробовать взять его адрес

Код

int x, y;   
(x + y) = 20; // rvalue, т.к. &(x + y) - ошибка компилятора
(x += y) = 20 ;// lvalue, т.к. &(x += y) - компилится успешно




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


Executables research
***


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

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



Ладно, случай с компиллером оставлю до завтра, когда самплов на генерю наработе. 
А вот вопрос с lvalue хочется все-таки до понять.

Порывшись в поисковике увидел:
Тут сказано, также как считаю и я:
Цитата

Объект есть область памяти; lvalue (адрес) есть выражение, ссылающееся на объект. Очевидный пример адресного выражения - имя объекта. Есть операции, дающие адресные выражения: например, если Е - выражение типа указатель, то *Е - адресное выражение, ссылающееся на объект, на который указывает Е. Термин "lvalue" происходит из выражения присваивания Е1=Е2, в котором левый операнд Е1 должен быть адресным (value) выражением.


есть
Код

int * p = &(x>y ? x : y);


это можно раскрыть в:

Код

if ( x > y ) 
{
   p = &x;
}
else
{
   p = &y;
}


тута вижу только p ,как lvalue . Потому что &x, &y стоят справа! Поэтому мне и не понятно, почему это Страуструп объект стоящий справа, а не слева называет lvalue ?!

P.S.:
Пока ктото напишет мне могу взорваться от непонимания и потому пока почитаю это )))

Это сообщение отредактировал(а) EvilsInterrupt - 11.10.2009, 13:33
PM MAIL WWW ICQ Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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