tobotras: (Default)
tobotras ([personal profile] tobotras) wrote2013-03-18 11:57 am

Стилистическое

Глядя в код некоторых коллег увидел тут глубокое экзистенциальное различие между нами. Акакувас?

[Poll #1902710]
vitus_wagner: My photo 2005 (white)

[personal profile] vitus_wagner 2013-03-18 09:23 am (UTC)(link)
В С++ результат фуннкции запросто может быть lvalue (неконстантной ссылкой).

[identity profile] dz.livejournal.com 2013-03-18 09:25 am (UTC)(link)
Факт.
Для Страуса в аду уже заготовлено отдельное, специальное, VIP-место.

[identity profile] deadmustdie.livejournal.com 2013-03-18 10:24 am (UTC)(link)
Ад - это всегда окружающие.
Тут кому что - кому C++, кому Scala какая-нибудь. Вкусовщина.
vitus_wagner: My photo 2005 (white)

[personal profile] vitus_wagner 2013-03-18 10:32 am (UTC)(link)
Бьярни соусем неуиновный. Мало ли народу извращенные брейнфаки сочиняло. Но почему именно С++ и php были приняты индустрией?

[identity profile] mklochkov.livejournal.com 2013-03-18 12:28 pm (UTC)(link)
C++ похож на своего прародителя (имеется в виду язык Си, а не Страуструп лично) — программировать на нем надо с не меньшей осмотрительностью.
Год назад я кое-что написал об этом: http://mklochkov.livejournal.com/72917.html
И вынесу еще раз сюда: «... если вы возьметесь писать на нем программы, не уделив достаточно внимания его изучению, вы можете получить неприятный сюрприз: язык Си коварен!»
vitus_wagner: My photo 2005 (white)

[personal profile] vitus_wagner 2013-03-18 01:49 pm (UTC)(link)
Вот интересно, если наш добрый знакомый croco на Питера ван дер Линдена (автора книги Expert C Programming и одного из авторов сановского компилятора C) налезет, кто кого сборет? ван дер Линден, помнится, утверждал, что в C массивы вполне себе есть и их ни в коем случае не следует путать с указателями, хотя есть контексты, в которых то и другое равноправны.

[identity profile] mklochkov.livejournal.com 2013-03-18 02:45 pm (UTC)(link)
Два упомянутых уважаемых человека говорят примерно об одних и тех же эффектах, но по-разному. Возьмем пример из той самой книжки Линдена, где он описывает, как делать не надо:
char * localized_time(char * filename)
{
    struct tm *tm_ptr;
    struct stat stat_block;
    char buffer[120];
    /* get the sourcefile's timestamp in time_t format */
    stat(filename, &stat_block);
    /* convert UNIX time_t into a struct tm holding local time */
    tm_ptr = localtime(&stat_block.st_mtime);
    /* convert the tm struct into a string in local format */
    strftime(buffer, sizeof(buffer), "%a %b %e %T %Y", tm_ptr);
    return buffer;
} 

И Линден, и croco заставляют нас обратить внимание, что в предпоследней строке buffer, хотя вроде как является именем массива, приводит к тому, что в регистр eax помещается всего лишь указатель на некий фрагмент памяти, а этот фрагмент после возврата из функции имеет неопределенное содержание и вообще может не существовать.