После прочтения этой книги задумался, кому бы мог её рекомендовать? Уж точно не начинающим. И, конечно, не профессионалам, которые используют язык Си в повседневной работе. Скорее всего, она могла бы помочь вспомнить Си программисту, который когда-то плотно с ним работал, но по каким-то причинам перешёл на другие технологии. Почему так?
С одной стороны, в этой книге привлекает чёткая структура и лаконичность изложения. В ней присутствуют все разделы, которые хотелось бы видеть в справочнике по языку Си. Изложение базируется на кроссплатформенном компиляторе GCC, что позволяет единообразно излагать материал для пользователей разных операционных систем. Интересна и методика изложения примеров программ. Текст программы выдаётся не сразу, а «проявляется» порциями в той последовательности, в которой его создавал бы программист. Присутствует раздел с описанием сборки программ, исходный текст которых разбит на несколько файлов, приводится способ локализации глобальных объявлений с помощью ключевого слова static.
С другой стороны, при её чтении возникает ощущение какого-то сюрреализма. Через некоторое время начинаешь понимать, что отдельные понятия «кодируются» непривычными словами. Прежде всего – это использование слова «утверждение» вместо традиционного термина «оператор». Дальше можно встретить высказывания о том, что «эта функция менее могущественна», или даже такую аннотацию раздела книги, посвящённого использованию условных операторов:
"Здесь показывается, как с помощью утверждений можно оценивать выражения, чтобы определить направление, в котором следует создавать программу".
Непросто по приведенному описанию понять и для чего предназначена функция tmpnam (): «Эта функция хранит строку, располагающуюся в массиве, и возвращает указатель с уникальным именем, указывающим на этот массив. Массив arr должен иметь как минимум L-tmpnam символов. Функция tmpnam() генерирует новое имя при каждом вызове». В описании функции fseek () словосочетание «original position» переведено как «оригинальная позиция» вместо «исходное положение». Наверное, похожим образом выглядел бы текст «Алисы в Стране Чудес», если бы её перевели дословно.
Книгу нельзя рекомендовать в качестве учебника из-за небрежности в определении понятий. Например, в справочном разделе написано, что «поток – это источник данных, который завершается символом новой строки \n». Получается, что из потока можно прочитать только одну строку? Такое утверждение противоречит практике. На странице 66 каким-то непостижимым образом унарную битовую операцию НЕ применяют к двум аргументам и пытаются объяснить полученный результат: 1010 ~ 0011 = 0100. «Операция разыменования» – это всё-таки операция доступа к данным по указателю, а не объявление переменной-указателя, как сообщает автор на странице 100. С таким же успехом звёздочку можно было бы назвать операцией умножения. Туманно объясняется рекурсия и действие оператора множественного выбора switch-case.
Ошибок в коде не то, чтобы очень много, но и без них не обошлось. Например, на странице 109 в теле функции caller () вместо «(function*)(b);» должно быть написано «return (*function)(b);». На странице 158 автор пишет, что «чтобы получить число от 0 до 9, следует использовать выражение rand() % 9». На самом деле это выражение даст число от 0 до 8 – остаток от деления 9 на 9 равен 0. На странице 61 перепутаны строки «Чётное число» и «Нечётное число».
В блоках «На заметку» и списках тезисов после глав встречаются полезные рекомендации. Но в целом можно сказать, что книга не содержит каких-то уникальных сведений о языке программирования Си. Особенности перевода усложняют восприятие материала и снижают ценность справочных сведений, приведенных в конце книги.
«Программирование на С для начинающих» kitobiga sharhlar