В качестве утренней гимнастики :)

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

В качестве утренней гимнастики :)

Сообщение aissp »

Мона отвечать про себя.

1. Будет ли работать такой код

{
int& c = 1.0;
cout << c << endl;
}
а такой?
{
const int& c = 1.0;
cout << c << endl;
}
2. Что анпечатают ети программы (если чего нибудь напечатают)
struct q1 { ~q1() {cout << "from q1" << endl; } }
struct q2 { ~q2() {cout << "from q2" << endl; } }
void func1(void) { q2 my_q2; exit(0);}
void func2(void) { q2 my_q2; abort();}


static q1 my_q1;
int main(void) {
func1();
}
}
...........
static q1 my_q1;
int main(void) {
func2();
}
}

Надо бы конечно скрыть все ето за лесом но лениво :)
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

1. Будет ли работать такой код

{
int& c = 1.0;
cout << c << endl;
}
Даже и компилироваться не должен. Приведение временной переменной к неконстантному референсу, по идее запрещено. Проверять лень.
{
const int& c = 1.0;
cout << c << endl;
}
Работать в частном случае может, но вообще говоря, не обязан. Момент удаления временной переменной - это на усмотрение компилятора. Может быть еще будет существовать ко второй строчке, а может и нет.
2. Что анпечатают ети программы (если чего нибудь напечатают)
struct q1 { ~q1() {cout << "from q1" << endl; } }
struct q2 { ~q2() {cout << "from q2" << endl; } }
void func1(void) { q2 my_q2; exit(0);}
void func2(void) { q2 my_q2; abort();}
Ну, по идее, во втором случае, деструкторы вызывать не надо, а в первом надо. Проверять лень.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

1a + 1b -
2-

Следуюший =)
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

1. Не будет компилироваться, т.к. делается попытка инициализировать ссылку, через которую потенциально можно изменить объект, адресом временной переменной. Причина описана sz в его объяснении к пункту #2.
2. Компилируется и работает. Ссылка на константу обещает не менять значение константы. Насколько я понимаю, ссылка будет инициализирована адресом константы в data блоке программы. Был бы дома - сказал бы наверняка ;).
3. Ничего не будет напечатано, т.к. деструкторы не будут вызваны в обоих случаях. Abort вообще не вызывает деструкторы, а exit вызывает, но только для глобальных переменных.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

1а и 2 прав азазелло
1б прав Зотин, ибо С++ не гарантирует хранение целочисленных констант в сегменте данных, он вполне может (и делает) для оптимизации класть их в код.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

1b == {
int tmp = 1.0
const int& c = tmp;
cout << c << endl;
}

соотвественно время существования до фигурных скобок

2. exit() вызывает деструкторы глобальных и статических обзектов, соотвественно напечатает "from q1"

но хочу заметить что ето уже не утренняя зарабка а вечерний моцион :)
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

Гимнасты, блин... :lol:
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

Упс... Что-то я конец с main() вообще не заметил в примере ;)... Естественно, "from q1" будет напечатано в примере с func1(). Хех, объяснить - объяснил, а решил неправильно ;)
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

aissp писал(а):1b == {
int tmp = 1.0
const int& c = tmp;
cout << c << endl;
}

соотвественно время существования до фигурных скобок
Стандартом это не регламентируется, насколько я помню.
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Круто, что ты помнишь стандарт - я вот в него тока лажу ингода :)

Но вообще регламентируется конечно:

8.5.3 References

спервва пункт 10:
10
--Otherwise, a temporary of type "cv1 T1" is created and initialized
from the initializer expression using the rules for a non-refer-
ence copy initialization (_dcl.init_). The reference is then
bound to the temporary. If T1 is reference-related to T2, cv1
must be the same cv-qualification as, or greater cv-qualification
than, cv2; otherwise, the program is ill-formed. [Example:
const double& rcd2 = 2; // rcd2 refers to temporary
// with value `2.0'
const volatile int cvi = 1;
const int& r = cvi; // error: type qualifiers dropped
--end example]
а затем в пункте
12.2 Temporary objects в подпункте 5 фиксируется время жизни временного объекта равное времени жизни костантной ссылки.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Был неправ. Посыпаю голову пеплом :-)
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Cmm'on bro
Я таких вещей тоже не помню, и решил что лучший способ их запоминать - постить в каморку :)
Аватара пользователя
sz
Маньяк
Сообщения: 1266
Зарегистрирован: 17 фев 2003, 19:34

Сообщение sz »

Для любителей извращенного кода: http://www.codemaestro.com/reviews/review00000105.html

У меня, кстати, есть сомнения, что на самых новых процесорах он обгонит обычный 1/sqrt(x). Преобразование int к float нынче дорого.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

aissp писал(а):Круто, что ты помнишь стандарт - я вот в него тока лажу ингода :)

Но вообще регламентируется конечно:

8.5.3 References
пару раз уже замечал, что стандард хорош тем, что открыв его
в любом месте и прочитав пол-страницы в любом направлении,
вседа можно узнать для себя что-то новое
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

sz писал(а):Для любителей извращенного кода: http://www.codemaestro.com/reviews/review00000105.html

У меня, кстати, есть сомнения, что на самых новых процесорах он обгонит обычный 1/sqrt(x). Преобразование int к float нынче дорого.
скорее потому что Intel сперло втот hack у Carmack'a и зашило его в железо :)
Ответить