Страница 1 из 2
В качестве утренней гимнастики :)
Добавлено: 24 янв 2007, 09:40
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();
}
}
Надо бы конечно скрыть все ето за лесом но лениво

Добавлено: 24 янв 2007, 10:20
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();}
Ну, по идее, во втором случае, деструкторы вызывать не надо, а в первом надо. Проверять лень.
Добавлено: 24 янв 2007, 10:26
aissp
1a + 1b -
2-
Следуюший =)
Добавлено: 24 янв 2007, 19:42
Azazello
1. Не будет компилироваться, т.к. делается попытка инициализировать ссылку, через которую потенциально можно изменить объект, адресом временной переменной. Причина описана sz в его объяснении к пункту #2.
2. Компилируется и работает. Ссылка на константу обещает не менять значение константы. Насколько я понимаю, ссылка будет инициализирована адресом константы в data блоке программы. Был бы дома - сказал бы наверняка

.
3. Ничего не будет напечатано, т.к. деструкторы не будут вызваны в обоих случаях. Abort вообще не вызывает деструкторы, а exit вызывает, но только для глобальных переменных.
Добавлено: 24 янв 2007, 20:12
aldep
1а и 2 прав азазелло
1б прав Зотин, ибо С++ не гарантирует хранение целочисленных констант в сегменте данных, он вполне может (и делает) для оптимизации класть их в код.
Добавлено: 24 янв 2007, 21:09
aissp
1b == {
int tmp = 1.0
const int& c = tmp;
cout << c << endl;
}
соотвественно время существования до фигурных скобок
2. exit() вызывает деструкторы глобальных и статических обзектов, соотвественно напечатает "from q1"
но хочу заметить что ето уже не утренняя зарабка а вечерний моцион

Добавлено: 24 янв 2007, 21:17
Marmot
Гимнасты, блин...

Добавлено: 24 янв 2007, 21:21
Azazello
Упс... Что-то я конец с main() вообще не заметил в примере

... Естественно, "from q1" будет напечатано в примере с func1(). Хех, объяснить - объяснил, а решил неправильно

Добавлено: 24 янв 2007, 21:43
aldep
aissp писал(а):1b == {
int tmp = 1.0
const int& c = tmp;
cout << c << endl;
}
соотвественно время существования до фигурных скобок
Стандартом это не регламентируется, насколько я помню.
Добавлено: 25 янв 2007, 09:52
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 фиксируется время жизни временного объекта равное времени жизни костантной ссылки.
Добавлено: 25 янв 2007, 10:08
aldep
Был неправ. Посыпаю голову пеплом

Добавлено: 25 янв 2007, 10:10
aissp
Cmm'on bro
Я таких вещей тоже не помню, и решил что лучший способ их запоминать - постить в каморку

Добавлено: 25 янв 2007, 10:25
sz
Для любителей извращенного кода:
http://www.codemaestro.com/reviews/review00000105.html
У меня, кстати, есть сомнения, что на самых новых процесорах он обгонит обычный 1/sqrt(x). Преобразование int к float нынче дорого.
Добавлено: 25 янв 2007, 11:45
ajkj3em
aissp писал(а):Круто, что ты помнишь стандарт - я вот в него тока лажу ингода :)
Но вообще регламентируется конечно:
8.5.3 References
пару раз уже замечал, что стандард хорош тем, что открыв его
в любом месте и прочитав пол-страницы в любом направлении,
вседа можно узнать для себя что-то новое
Добавлено: 25 янв 2007, 11:46
ajkj3em
скорее потому что Intel сперло втот hack у Carmack'a и зашило его в железо :)