Этот вопрос пытается собрать поддерживаемый сообществом список качественных книг на языке программирования c, ориентированных на различные уровни квалификации.
C - это сложный язык программирования, который сложно освоить на ходу, читая онлайн-уроки. Подробная книга часто является лучшим способом изучения языка, и поиск хорошей книги - это первый шаг. Важно избегать плохо написанных книг и, что еще важнее, книг, содержащих серьезные технические ошибки.
Пожалуйста, предложите внести изменения в принятый ответ, чтобы добавить качественные книги, с приблизительным уровнем квалификации и кратким описанием/описанием каждой книги. (Обратите внимание, что вопрос заблокирован, поэтому новые ответы не будут приняты. В списке сохраняется один ответ)
Не стесняйтесь обсуждать выбор книг, качество, заголовки, резюме, уровни квалификации и все, что вы видите, что неправильно. Книги, которые сообщество C считает удовлетворительными, останутся в списке; остальные будут регулярно удаляться.
Для книг, которые имеют рецензии Ассоциации пользователей C и C++ (ACCU), ссылка на эти рецензии должна быть добавлена вместе с книгой.
Смотрите также:
Этот вопрос обсуждался на Meta в рамках аудита удаленных вопросов 2018 года.
Консенсус состоял в том, чтобы сохранить его и активно поддерживать.
Предупреждение
Это список случайных книг разного качества.По мнению некоторых людей (с некоторым обоснованием), это больше не список рекомендуемых книг.Некоторые из перечисленных книг содержат явно неверные утверждения или учат неправильным/вредным практикам.Люди, которые знают о таких книгах, могут редактировать этот ответ, чтобы улучшить его.См . Список книг С потерял свою актуальность.Что с этим делать? а также удаленный вопрос аудита 2018 года.
Язык программирования Си (2-е издание) - Брайан У. Керниган и Деннис М. Ричи (1988). Все еще хорошее, краткое, но полное введение в C (C90, а не C99 или более поздние версии), написанное изобретателем C. Однако язык изменился, и за последние 25 лет был разработан хороший стиль C, и есть части книга, показывающая его возраст.
C: Справочное руководство (5-е издание) - Сэмюэл П. Харбисон и Гай Р. Стил (2002). Отличный справочник по C, вплоть до C99. Это не учебник, и, вероятно, не подходит для начинающих. Замечательно, если вам нужно написать компилятор для C, как это делали авторы, когда начинали.
C Pocket Reference (O'Reilly) - Питер Принц и Улла Кирх-Принц (2002).
Comp.lang.c FAQ - Стив Саммит. Веб-сайт с ответами на многие вопросы о C.
Различные версии стандартов языка Си можно найти здесь. Существует онлайн-версия проекта стандарта C11.
Новый стандарт С - аннотированная ссылка (Free PDF) - Дерек М. Джонс (2009). Упоминаемый "новый стандарт" - это старый стандарт C99, а не C11.
Программирование на С (4-е издание) - Стивен Кочан (2014). Хорошее общее введение и учебник.
C Primer Plus (5-е издание) - Стивен Прата (2004)
Программирование на C: современный подход (2-е издание) - KN King (2008). Хорошая книга для изучения C.
Книга о Си - Эл Келли/Ира Поля (1998).
The C Book (Free Online) - Майк Банахан, Деклан Брейди и Марк Доран (1991).
C: Как программировать (8-е издание) - Пол Дейтель и Харви М. Дейтель (2015). Много хороших советов и лучших практик для начинающих. Индекс очень хороший и служит достойной ссылкой (только не полностью и очень поверхностно).
Head First C - Дэвид Гриффитс и Дон Гриффитс (2012).
Начало C (5-е издание) - Айвор Хортон (2013). Очень хорошее объяснение указателей, используя множество маленьких, но полных программ.
Самс учит себя за 21 день - Брэдли Л. Джонс и Питер Эйткен (2002). Очень хороший вводный материал.
Программирование приложений в ANSI C - Ричард Джонсонбо и Мартин Калин (1996).
Объектно-ориентированное программирование с использованием ANSI-C (Free PDF) - Axel-Tobias Schreiner (1993). Код становится немного запутанным. Если вы хотите C++, используйте C++.
Интерфейсы и реализации C - Дэвид Р. Хэнсон (1997). Предоставляет информацию о том, как определить границу между интерфейсом и реализацией в C общим и многократно используемым способом. Он также демонстрирует этот принцип, применяя его к реализации общих механизмов и структур данных в C, таких как списки, наборы, исключения, манипуляции со строками, распределители памяти и многое другое. По сути, Хансон взял весь код, который он написал как часть создания Icon и lcc, и вытащил лучшие биты в форме, которую другие люди могли бы использовать для своих собственных проектов. Это модель хорошего C-программирования с использованием современных методов проектирования (включая абстракцию данных Liskov), показывающая, как организовать большой C-проект в виде набора полезных библиотек.
The C Puzzle Book - Алан Р. Фейер (1998)
Стандартная библиотека C - PJ Plauger (1992). Он содержит полный исходный код для реализации стандартной библиотеки C89, наряду с обширным обсуждением дизайна и того, почему код разработан, как показано.
21-й век C: C Советы от новой школы - Бен Клеменс (2012). В дополнение к языку C в книге описываются gdb, valgrind, autotools и git. Комментарии к стилю находятся в последней части (глава 6 и далее).
Алгоритмы на Си - Роберт Седжвик (1997). Дает вам реальное понимание реализации алгоритмов на C. Очень ясный и понятный; вероятно, вы захотите выбросить все остальные книги по алгоритмам и оставить эту.
Указатели на Си - Кеннет Рик (1997).
Указатели на Си - Навин Топпо и Хришикеш Деван (2013).
Решение проблем и разработка программ на языке Си (6-е издание) - Джери Р. Ханли и Эллиот Б. Коффман (2009).
Структуры данных - расширенный подход с использованием C - Джеффри Эсаков и Том Вайс (1989).
C Unleashed - Ричард Хитфилд, Лоуренс Кирби и др. (2000). Не идеально, но стоит программистам среднего уровня, практикующим задачи, написанные в этой книге. Это хороший подход к кулинарной книге, предложенный авторами comp.lang.c.
Эксперт C Программирование: Deep C Secrets - Питер ван дер Линден (1994). Много интересной информации и военных историй от команды компиляторов Sun, но немного устаревших местами.
Расширенное программирование на С на примере - Джон В. Перри (1998).
Расширенное программирование в среде UNIX - Ричард В. Стивенс и Стивен А. Раго (2013). Подробное описание того, как использовать API Unix из кода C, но не столько о механике программирования C.
Essential C (бесплатный PDF) - Ник Парланте (2003). Обратите внимание, что это описывает язык C90 в нескольких точках (например, при обсуждении //
комментариев и размещении объявлений переменных в произвольных точках в коде), поэтому к нему следует относиться с некоторой осторожностью.
Вопросы и ответы по программированию: часто задаваемые вопросы - Стив Саммит (1995). Это книга сайта, перечисленного ранее. Это не покрывает C99 или более поздние стандарты.
C в двух словах - Питер Принц и Тони Кроуфорд (2005). Отличная книга, если вам нужна ссылка на C99.
Функционал С. Питер Хартел и Хенк Мюллер (1997). Преподает современные практики, которые неоценимы для низкоуровневого программирования, с учетом параллелизма и модульности.
Практика программирования - Брайан У. Керниган и Роб Пайк (1999). Очень хорошая книга для сопровождения K & R. Он также использует C++ и Java.
C Ловушки и ловушки А. Кениг (1989). Очень хорошо, но стиль C предшествует стандарту C, что делает его менее рекомендуемым в наши дни.
Некоторые приводят доводы в пользу исключения "ловушек и ловушек" из этого списка, поскольку некоторые люди попадают в ловушку ошибок;другие продолжают отстаивать его включение.Возможно, ее следует рассматривать как "экспертную" книгу, потому что для понимания того, что изменилось с момента ее публикации, требуется умеренно обширное знание языка Си.
Создай свой собственный Lisp - Даниэль Холден (2014). Приятный способ выучить C.
MISRA-C - отраслевой стандарт, публикуемый и поддерживаемый Ассоциацией по надежности программного обеспечения автомобильной промышленности. Обложки С89 и С99.
Хотя это не книга как таковая, каждый опытный программист на С должен читать и реализовывать как можно больше.Первоначально MISRA-C был задуман как руководство для приложений, критически важных для безопасности, но он применим к любой области приложения, где требуется стабильный, безошибочный C-код (кто не хочет меньше ошибок?).MISRA-C становится стандартом де-факто во всей индустрии встраиваемых систем и становится все более популярным даже в других областях программирования.Существует (как минимум) три публикации стандарта (1998, 2004 и текущая версия от 2012).Существует также документ с рекомендациями по соответствию MISRA от 2016 года и поправка 1 к MISRA C: 2012 - Дополнительные рекомендации по безопасности для MISRA C: 2012 (опубликовано в апреле 2016 года).
Обратите внимание, что некоторые ограничения в правилах MISRA не подходят для каждого контекста.Например, директива 4.12 гласит: "Динамическое распределение памяти не должно использоваться".Это подходит для встроенных систем, для которых разработаны правила MISRA;это не везде уместно.(Например, компиляторы обычно используют динамическое выделение памяти для таких вещей, как таблицы символов, и обойтись без динамического выделения памяти будет сложно, если не абсурдно.)
Архивные списки рецензируемых ACCU книг по Beginner C (116 наименований) от 2007 года и Advanced C (76 наименований) от 2008 года. Большинство из них больше не отображаются на основном сайте, и вы не можете просматривать их по темам тем не мение.
Остерегайтесь книг, написанных Гербертом Шильдтом. В частности, вам следует держаться подальше от C: The Complete Reference (4th Edition, 2000), известной в некоторых кругах как C: The Complete бессмыслица.
Также опасайтесь книги Let Us C (16 - е издание, 2017 г.) по Яшвантом Kanetkar. Некоторые люди видят в ней ужасно устаревшую книгу, которая учит Turbo C и содержит много устаревших, вводящих в заблуждение и совершенно неверных материалов.
Узнайте С трудный путь (2015) Зед Шоу. Книга со смешанными рецензиями. Критика этой книги Тимом Хентенааром:
Подводя итог моим взглядам, изложенным ниже, автор представляет материал в очень упрощенном и вводящем в заблуждение виде, весь корпус представляет собой сложную путаницу, а некоторые из представленных им мнений и анализов просто ошибочны. Я пытался взглянуть на эту книгу глазами новичка, но, к сожалению, на меня влияет многолетний опыт написания кода на языке C. Для меня очевидно, что либо автор имеет ошибочное понимание языка C, либо он намеренно упрощает Точка, в которой он на самом деле вводит читателя в заблуждение (намеренно или нет.)
"Learn C The Hard Way" - это не книга, которую я мог бы порекомендовать кому-то, кто одновременно учится программировать и изучает C. Если вы уже являетесь компетентным программистом на каком-либо другом родственном языке, то это интересная и необычная экспозиция С, хотя у меня есть оговорки по поводу частей книги. Джонатан Леффлер
Другие участники, не внесенные в историю изменений:
Алекс Локвуд, Бен Джексон, Пузыри, Когти, Коледот, Дана Робинсон, Даниэль Холден, Дервин Танк, DWC, Эрси Хоу, Гарен, Хазиз, Йохан Безем, Джонатан Леффлер, Джошуа Партоги, Лукас, Лундин, Мэтт К., Мосспликс, Маттье М., Мидор, Ницше-Жу, Норман Рэмси, r3st0r3, Riththyself, Роберт С. Барнс, Тим Ринг, Тони Бай, VMAtm
Я хочу сделать рекомендацию. Ни в коем случае не следует читать книги Герберт Шильдт. В частности, вам следует избегать C: Полная ссылка.
Учебник Zed Shaw для начинающих, которые нацелены на современные методы, с акцентом на безопасность и безопасность.
Альфа-версия доступна в Интернете.
Я думаю, что предисловие Зеда покрывает его лучше, чем я мог:
Как читать эту книгу
Эта книга предназначена для программистов, которые изучили хотя бы один другой язык программирования. Я отсылаю вас к Learn Python The Hard Way или Изучите Ruby The Hard Way, если вы еще не научились язык программирования еще. Эти две книги предназначены для начинающих и работают очень хорошо. Как только вы это сделаете, вы можете вернуться и начать эту книгу.
Для тех, кто уже научился кодировать, эта книга может показаться странной. Это не похоже на другие книги, где вы читаете абзац после абзаца прозы, а затем вводите немного кода здесь и там. Вместо этого у меня есть код, и я объясню, что вы только что сделали. Это работает лучше, потому что вам легче объяснить то, что вы уже испытали.
Из-за этой структуры в этой книге есть несколько правил:
- Введите весь код. Не копируйте-вставить!
- Введите код точно, даже комментарии.
- Получить его для запуска и убедиться, что он печатает тот же результат.
- Если есть ошибки, исправьте их.
- Сделайте дополнительный кредит, но это нормально, чтобы пропустить те, которые вы не можете понять.
- Всегда пытайтесь понять это, прежде чем пытаться получить помощь.
Если вы следуете этим правилам, делайте все в книге и не можете кодировать C, то вы, по крайней мере, попробовали. Это не для всех, но попытка попробовать сделает вас лучшим программистом.
Книга не для слабонервных: Глава 5 - Упражнение 4: Знакомство с Valgrind! Но это его сила; он не пытается защитить вас от истины, но тут же раскрывает детали gory и объясняет, как с ними справиться.
Я добавил Стандартную библиотеку C П. Дж. Плагера. Он содержит полный исходный код для реализации стандартной библиотеки C89 наряду с обширным обсуждением. Это очень влияло на мой стиль программирования C. Как библиотека, она гораздо более доступна, чем, скажем, STL.
Я думаю, что знания, которые вы ищете, можно найти не в книгах о C, а в книгах и статьях о дизайне системы. К сожалению, они довольно тонкие на земле. Вы можете рассмотреть
Абстракция и спецификация в разработке программ Барбарой Лисковым и Джоном Гуттагом (а не новой версией на основе Java только Лисковым). Это учебный текст, но есть идеи, о которых стоит подумать.
Книги конца 1970-х - начала 1980-х годов Тондом и Майерсом по структурированному дизайну (один называется Композитный/структурированный дизайн.
Для примера того, как организовать большой проект C как набор полезных библиотек, вы не можете бить C Интерфейсы и реализации Дейвом Хэнсоном. В основном Хэнсон взял весь код, который он написал как часть построения Icon и lcc и вытащил лучшие биты в форме, которую другие люди могли бы повторно использовать для своих собственных проектов. Это модель хорошего программирования на C с использованием современных методов проектирования (включая абстракцию данных Лискова).
Не могу поверить, что я не вижу "Мышление в C" от Брюса Эккеля здесь. Стильная книга, ясный язык, простые мысли и глубокое понимание. Книга полностью стоит того. На каждой странице есть достойный контент, и он никогда на меня не скучал. Благодаря плавному обучению эта книга подходит для всех и каждого.
В книге также есть вопрос "мозгового штурма" с книгой ответов.
Практика программирования (Addison-Wesley Professional Computing Series) - Брайан У. Керниган Мягкая обложка. Я думаю, что это очень хорошая книга, чтобы сопровождать K & R.
И это тоже:
Алгоритмы в C, части 1-5 (Bundle): основы, структуры данных, сортировка, поиск и алгоритмы графа (3-е издание) (в мягкой обложке) Роберт Седжвик
Мои 2 цента.
Вот куча книг, посвященных ACCU, на Beginner C (116 название) и Advanced C (76 наименований). Многие из них больше не выглядят на основном сайте (которые вы не можете просматривать по теме в любом случае).
C в двух словах Питера Принца - отличная книга, если вам нужна ссылка для C99.
Чтобы стать экспертом C, вам лучше прочитать " стандарт ISO/IEC 9899: 1999 C". " Обоснование для стандарта C99" и " Новый стандарт C" может помочь вам лучше понять стандарт C.
Решение проблем и дизайн программ в C (6-е издание) - это книга промежуточного уровня. Если у вас есть другие книги C Advanced, то это не идеальная книга для покупки, но ее определенно стоит пройти один раз.
Прочитав одни и те же книги, надеюсь, я смогу помочь с несколькими другими:
И, наконец, хорошая поваренная книга, например, от авторов comp.lang.c:
Если вы не возражаете против вводных книг по программированию, которые дают много хороших советов и лучших практик, я рекомендую книги Deitel и Deitel, такие как С++: как программировать. Не уверен, что C в печати. Индекс очень хорош и служит достойной ссылкой, но не полностью исчерпывающей.
Новичок: Приложения Программирование в ANSI C, Джонсонбо и Калин
Промежуточное: Структуры данных - Расширенный подход с использованием C, Эсаков и Вайс
Выше среднего: MISRA-C отраслевой стандарт, опубликованный и поддерживаемый Ассоциацией надежности автомобильной промышленности. (C89)
Хотя это не книга как таковая, я настоятельно рекомендую всем опытным программистам на C читать и реализовывать их. Первоначально MISRA-C был предназначен в качестве рекомендаций для важных для безопасности приложений, но он применим к любой области применения, где требуется стабильный, не требующий ошибок код C (кто не хочет меньше ошибок?). MISRA-C становится фактическим стандартом во всей внедренной отрасли и становится все более популярным даже в других областях программирования. Существуют две публикации стандарта: одна с 1998 года и одна с 2004 года, где последняя является активной, релевантной.
Выше среднего уровня:
"Компьютерное программирование: введение для научно-наклонного" Отличная книга о научном использовании языков программирования.
C Unleashed: также хорошая книга. Это не идеал или что-то еще. Но для промежуточных программистов, безусловно, стоит практиковать программы, написанные в этой книге.
Продвинутый C.: Пища для образованного неба Нарайна Гехани
Одна из моих любимых книг на C, отличная по указателям, указатели на функции и разнообразная передовая тема, например, как материал хранится в памяти, динамическая память, использование стека, вызов функций и передача параметров и т.д. Предполагается, что у вас есть хорошая понять "C" для начала.
Абстракция и спецификация в разработке программ Барбарой Лисковым и Джоном Гуттагом - отличный ресурс для начала обучения C!