C++ похож на своего прародителя (имеется в виду язык Си, а не Страуструп лично) — программировать на нем надо с не меньшей осмотрительностью. Год назад я кое-что написал об этом: http://mklochkov.livejournal.com/72917.html И вынесу еще раз сюда: «... если вы возьметесь писать на нем программы, не уделив достаточно внимания его изучению, вы можете получить неприятный сюрприз: язык Си коварен!»
Вот интересно, если наш добрый знакомый croco на Питера ван дер Линдена (автора книги Expert C Programming и одного из авторов сановского компилятора C) налезет, кто кого сборет? ван дер Линден, помнится, утверждал, что в C массивы вполне себе есть и их ни в коем случае не следует путать с указателями, хотя есть контексты, в которых то и другое равноправны.
Два упомянутых уважаемых человека говорят примерно об одних и тех же эффектах, но по-разному. Возьмем пример из той самой книжки Линдена, где он описывает, как делать не надо:
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 помещается всего лишь указатель на некий фрагмент памяти, а этот фрагмент после возврата из функции имеет неопределенное содержание и вообще может не существовать.
no subject
no subject
Для Страуса в аду уже заготовлено отдельное, специальное, VIP-место.
no subject
Тут кому что - кому C++, кому Scala какая-нибудь. Вкусовщина.
no subject
no subject
Год назад я кое-что написал об этом: http://mklochkov.livejournal.com/72917.html
И вынесу еще раз сюда: «... если вы возьметесь писать на нем программы, не уделив достаточно внимания его изучению, вы можете получить неприятный сюрприз: язык Си коварен!»
no subject
no subject
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 помещается всего лишь указатель на некий фрагмент памяти, а этот фрагмент после возврата из функции имеет неопределенное содержание и вообще может не существовать.