Программистское
Oct. 25th, 2014 01:07 pmДано:
#include <stdio.h>
#include <stddef.h>
ptrdiff_t frame(char * prev) {
char dummy;
if (prev) {
return prev - &dummy;
}
else return frame(&dummy);
}
void main() {
printf("%ld\n", frame(0));
}
Что эта программа печатает, будучи скомпилирована с отключенной оптимизацией? Что - с включенной оптимизацией? Почему?
no subject
Date: 2014-10-25 08:20 pm (UTC)no subject
Date: 2014-10-25 08:46 pm (UTC)no subject
Date: 2014-10-25 08:52 pm (UTC)no subject
Date: 2014-10-25 09:00 pm (UTC)no subject
Date: 2014-10-26 01:33 am (UTC)no subject
Date: 2014-10-26 07:37 am (UTC)32 - благодаря оптимизации не нужно сохранять некоторые регистры
0 - ошибка, на мой взгляд
-1 - при инлайнинге два экземпляра переменной оказались рядом не в том порядке, который ожидался
no subject
Date: 2014-10-25 08:45 pm (UTC)no subject
Date: 2014-10-25 08:53 pm (UTC)no subject
Date: 2014-10-25 08:52 pm (UTC)no subject
Date: 2014-10-25 09:01 pm (UTC)no subject
Date: 2014-10-25 09:02 pm (UTC)no subject
Date: 2014-10-25 09:09 pm (UTC)Кстати, %ld не соответствует ptrdiff_t — ещё одно UB.
no subject
Date: 2014-10-25 11:05 pm (UTC)no subject
Date: 2014-10-25 11:15 pm (UTC)no subject
Date: 2014-10-26 01:34 am (UTC)no subject
Date: 2014-10-26 01:37 am (UTC)no subject
Date: 2014-10-26 07:39 am (UTC)Насчет существования специальной буквы формата для ptrdiff_t я знаю, но однажды попробовал, а она не везде работает, поэтому я решил не выпендриваться.
no subject
Date: 2014-10-26 08:29 am (UTC)А чтобы не выпендриваться неплохо бы вставить явное преобразование типа, уж коли мы знаем, что диапазон значений будет ограниченным:
printf("%ld\n", (long)frame(0));
или для параноиков:
printf("%lld\n", (long long)frame(0));
Но есть один богомерзкий компилятор, который не понимает даже %lld и long long. :)
no subject
Date: 2014-10-25 10:52 pm (UTC)дополнение
Date: 2014-10-25 11:24 pm (UTC)Re: дополнение
Date: 2014-10-25 11:26 pm (UTC)Re: дополнение
Date: 2014-10-25 11:33 pm (UTC)Re: дополнение
Date: 2014-10-25 11:45 pm (UTC)Так о чем спор?
Re: дополнение
Date: 2014-10-25 11:47 pm (UTC)Re: дополнение
Date: 2014-10-26 07:40 am (UTC)Re: дополнение
Date: 2014-10-26 08:37 am (UTC)http://archaicos.livejournal.com/218516.html
Или у тебя остались вопросы или образовалась лёгкая потеря памяти?
Re: дополнение
Date: 2014-10-26 03:15 pm (UTC)Re: дополнение
Date: 2014-10-26 08:38 pm (UTC)Re: дополнение
Date: 2014-10-27 05:08 am (UTC)Re: дополнение
Date: 2014-10-27 08:03 am (UTC)C(++) делали, не следуя этому принципу.
http://c2.com/cgi/wiki?PrincipleOfLeastAstonishment:
"C++ is astonishing in that Stroustrup wrote a book (TheDesignAndEvolutionOfCpp) full of examples where PrincipleOfLeastAstonishment is violated, yet after reading it they mysteriously make sense..."
:)
http://lucumr.pocoo.org/2011/7/9/python-and-pola/:
Same $h!t, pretty much. :)
no subject
Date: 2014-10-25 09:19 pm (UTC)no subject
Date: 2014-10-25 09:35 pm (UTC)no subject
Date: 2014-10-25 10:13 pm (UTC)Фунги кто?Грибы где?no subject
Date: 2014-10-25 11:12 pm (UTC)Ох уж эти инлайновые функции.
no subject
Date: 2014-10-26 07:42 am (UTC)no subject
Date: 2014-10-28 02:36 am (UTC)Такая хакерская штука, чтобы перехватить управление чьим-то компьютером.
Она как раз через стек, говорят, работает.
no subject
Date: 2014-10-28 03:12 am (UTC)no subject
Date: 2014-10-28 05:48 am (UTC)Мы в довольно замкнутом мире живём, так что приходится проверять даже то, о чём думает собственная голова.