
Когда я начинал изучать C, я сразу взялся за «библию» — «Язык программирования С» Брайана Кернигана и Денниса Ритчи.
Все советуют её первой книгой, и казалось бы, куда ещё? Но честно скажу — она зашла мне очень тяжело. Подходы, структура, хронология изложения — всё это оказалось непростым для полного новичка. Возможно, дело во мне, но как первая книга я бы её не рекомендовал.
«C для программиста с введением в С11» — Пол и Харви Дейтел
Эта книга стала для меня переломной. Я прочитал её за неделю, и именно здесь начал понимать, что и зачем делаю. Она системная, структурная и очень дружелюбная к читателю. После неё многие вещи в C перестали казаться магией.
Конечно, я смотрел видеоуроки и разборы, но они скорее закрепляли материал, чем заменяли книгу.
Второй заход на Кернигана и Ритчи
После Дейтелов я снова взял в руки «Язык программирования С» — и вот тут всё встало на свои места.
Там я уже находил не новые понятия, а другие подходы к реализации, полезные нюансы. Книга открылась с другой стороны: как настольное пособие для практикующего, а не как вводный курс.
«Язык C в 21 веке» — Бен Клеменс
Эта книга — просто хорошее современное введение. Легко читается, не перегружена, и в то же время освещает актуальные вещи. Лишней точно не будет.
«Язык C. Мастерство программирования: принципы, практики и паттерны» — Кристофер Прешерн
Вот здесь начинается уровень «продвинутый практик». Книга помогает не просто писать рабочий код, а думать о стиле, паттернах и архитектуре на C. Особенно интересно её читать параллельно с «Грокаем алгоритмы»Адитьи Бхаргавы. Эта связка даёт и алгоритмическое мышление, и инженерный подход.
Итог
Керниган Ритчи — классика, но тяжеловата как первая книга. Лучше вернуться к ней чуть позже.
Дейтелы — отличный старт для тех, кто хочет войти в язык без лишнего страха.
Клеменс и Прешерн — книги, которые развивают дальше и дают глубину.
Видео и статьи — хорошее дополнение, но основа у меня всё равно в книгах.
Каждый идёт своим путём, и, возможно, кто-то «проглотит» K&R с первого раза. Но если у вас не получилось — это нормально. Главное — найти материал, который «зайдёт» именно вам.
В комментариях посоветуйте хорошую литературу именно под Си пожалуйста
Комментарии (39)

dyadyaSerezha
02.09.2025 20:25Как почти всегда, нет введения с объяснением, почему полный новичок решил изучить С. А было бы интересно.
Автор, а почему a[5] и 5[a] это одно и то же? Или не одно? )

Serpentine
02.09.2025 20:25Все советуют её первой книгой, и казалось бы, куда ещё?
Кто эти «все» и «кому» они советуют? В аннотации от издательства и в авторском предисловии к K&R чёрным по русскому написано:
Книга не рекомендуется для чтения новичкам; для своего изучения она требует знания основ программирования и вычислительной техники.

edo1h
02.09.2025 20:25мой опыт: я читал k&r подростком, немного зная ассемблер и бейсик. Всё казалось простым и очень логичным.

Serpentine
02.09.2025 20:25Ваш комментарий и еще один ниже внезапно (!) никак не противоречат приведенной мной цитате. Зато она видимо обидела кого-то.
Зная ассемблер, так то и мне K&R простой показалась бы в свое время. И если что, новичок — это не про возраст. Не противоречит это и утверждению Константина Владимирова, что K&R должна быть первой (не важно в каком смысле «первой») книгой студента — сферический студент кафедры информатики в МФТИ сдецл отличается от сферического новичка в вакууме, ничего о программировании доселе не слышавшем.

unreal_undead2
02.09.2025 20:25отличается от сферического новичка в вакууме
А нужен ли вообще C сферическому новичку в вакууме? Всё таки это в первую очередь язык для тех, кому интересно, как реально код бежит на процессоре, и кто может конвертировать этот интерес в разработку софта (embedded, OS, компиляторы, прочие инструменты) - и обычно у таких людей какой то бэкграунд в программировании накапливается в школьные годы до знакомства с C.

Siemargl
02.09.2025 20:25не надо путать тогдашних новичков , способных набрать программу биткартой и сегодняшних

WindShear
02.09.2025 20:25Моя первая программа на С/С++ совсем с нуля

atues
02.09.2025 20:25Недурная книга для начинающих, НО только следует иметь в виду, что в ней описывается старая-престарая версия С (по первому изданию K&R). Кроме того, раздел по указателям и структурам (а это, в сущности, то, что составляет самый смак в языке) изложен конспективно. Я, все-таки, не рекомендовал бы ее.
Несмотря на угрожающие размеры, книги Прата и Дейтела мне кажутся куда лучше. Они, порой, утомляют чересчур подробным и детализированным изложением, но они соответствуют в целом современному С. К тому же примеры и упражнения в них полезнее и богаче.
P.S. И по-любому, K&R обязан прочесть любой сишник :) Пусть не самой первой, но обязательно

morgot
02.09.2025 20:25K&R для начинающего тяжело, мне хорошо зашёл Стивен Прата, очень подробно объясняет.

atues
02.09.2025 20:25Мне известны три перевода второго издания: "Финансы и статистика", "Невский диалект" и "Вильямс". Первые два перевода - отличные (особенно, от "Невского диалекта"), третий - мягко говоря, какой-то странный, imho. Но как раз третий распространен повсеместно и Вы, подозреваю, читали именно его?

SpiderEkb
02.09.2025 20:25Тоже начинал с него, но перевод не помню уже. Это был 1989-90гг.
Дальше уже, конечно были более серьезные книги, но легко вникнуть в основные понятия и концепции языка помогла именно книга Прата.

morgot
02.09.2025 20:25Если честно, не помню издателя) это более старая книга, и на обложке были рисунки будто русичи с летописи (может странно звучит, но факт). По ней и учился.

atues
02.09.2025 20:25Кстати, мне очень понравилась книга Роберта Сикорда "Эффективный C. Профессиональное программирование". Учить С по ней, пожалуй, не стоит - книга не для новичков. Но книга полезная, с упором на безопасное программирование

unreal_undead2
02.09.2025 20:25Практика программирования (Керниган/Пайк) - не только про C, но большая часть кода на нём.

peg59
02.09.2025 20:25Начинать программировать с С - навсегда угробить в себе программиста (заработать сишность головного мозга).

loropiana Автор
02.09.2025 20:25Считаю категорически наоборот , как по мне С самый лучший вход в программирование

edo1h
02.09.2025 20:25заработать сишность головного мозга
объясните что вы имеете в виду

peg59
02.09.2025 20:25Сишники не отличают процедуры от функций, не понимают побочных эффектов (поскольку практически все сишные выражения - один сплошной побочный эффект).
И вообще, С в силу своей ограниченности (отсутствие массивов, вложенных функций, процедур и пр., а также нелогичного синтаксиса (указателей) формирует неправильные представления о концепциях/парадигмах программирования. И эти представления очень трудно (если вообще) преодолимы). Очень похоже на подобных программистов, начинавших с Бейсика, о которых Дейкстра говорил, что их мозг безвозвратно искалечен.

edo1h
02.09.2025 20:25зато си формирует правильные представления о том как код исполняется. никакой магии, всё максимально близко к железу.
Сишники не отличают процедуры от функций
а в чём это отличие? чем плохо использование функции, не возвращающей значение?

atues
02.09.2025 20:25Даже? Ну, разумеется, в С нет разделения на процедуры и функции, но аналогом процедуры может служить функция, возвращающая void. Подскажите, насколько это критично - отсутствие понятия процедур в С? В java нет ни функций, ни процедур, только методы, но это, простите те же яйца, только сбоку и никому не мешает.
То, что некоторые сишники не понимают побочных эффектов, так это свойственно не только им. Они могут быть в любом распространенном ЯП. Может и есть ЯП, где эта фишка заколочена наглухо (единственное, что приходит на ум - rust), то это исключение из правил. Да, хорошо бы без них, но что имеем, то имеем. Думать просто надо, когда пишешь код. Это - сложно и скучно и не всем по душе.
Вложенные функции ни разу не понадобились. Их удобства я нисколько не отрицаю, но это точно не критично.
А вот насчет отсутствия массивов в С: если не трудно, подробнее можно?
Касаемо указателей. Да, это камень преткновения. Многие не могут понять, что значение и адрес значения - разные вещи. Можно без них программировать? Ессно: java, c# к примеру. Ну и пользуйте их на здоровье. Но в С (а тем более, в ассемблере, откуда косвенная адресация и пришла) без них плохо получается

peg59
02.09.2025 20:25Понадобилось - не понадобилось, речь вообще не об этом. Побочные эффекты в других ЯП тоже не аргумент (вообще избавиться от побочных эффектов невозможно). Сам стиль программы на С, состоящей практически полностью из побочных эффектов (и по-другому не написать), травмирует мышление начинающего.
Насчет отсутствия массивов. Я плохо умею объяснять. Вот, скажем, массив
int p[20];
А теперь мы пишем *(p + 5) = 12; Так правильно?
Или всё-таки p[5] = 12; ?
Я тут вижу имитацию массива указателями.
А вообще, рекомендую почитать А.В. Столяров, "Язык С и начальное обучение программированию".

atues
02.09.2025 20:25То Вы против С, то рекомендуете книгу Столярова (хорошая, кстати).
Я тоже не считаю, что С - это то, с чего следует начинать учиться. Этот язык для уже что-то понимающих

atues
02.09.2025 20:25int p[20];
А теперь мы пишем *(p + 5) = 12; Так правильно?
Или всё-таки p[5] = 12;
И так, и так - даст один результат:
#include <stdio.h> int main(void) { int p[20]; p[5] = 10; // Инициализируем printf("%d\n", p[5]); p[5] = 12; // Меняем "в лоб" printf("%d\n", p[5]); *(p+5) = 12; // Меняем через указатель printf("%d\n", p[5]); return 0; }Компилятор gcc 11.4.0 (Ubuntu)
Можете считать это синтаксическим сахаром ) Но лучше обратиться к первоисточнику (K&R). Но массивы входят в определение ядра языка (как и структуры, перечисления, объединения)

peg59
02.09.2025 20:25У Столярова хорошо изложено. Я только ухудаю.
Нет в С полноценного типа "массив". Попробуйте передать в функцию хотя бы двумерный массив. (Указатель на массив - страшная вещь!)

atues
02.09.2025 20:25Знаете, нет предела извращениям. Вот, например, функция, которая находит минимальное из двух целых (для общности пишу на псевдокоде):
min(a, b) = (a + b - abs(a-b)) >> 2
Ни одного if-а, заметьте. Но за такой код надо руки отрывать начиная от колен :) И тройные указатели встречались. Но это не значит, что так надо делать. Можно? Да. Нужно? Нет

kolezz
02.09.2025 20:25Ну, во-первых, а покажите abs без if-а. Если if-а не видно, то это не значит, что его нет.
Во-вторых, вы уверены, что >> 2 ? Деление на 2 - это >> 1.
А вообще красивый if. Я такого раньше не встречал. Только с переполнением у него плохо...
unreal_undead2
02.09.2025 20:25а покажите abs без if-а.
Навскидку (x ^ (x >> (sizeof(x)*8-1))) - (x >> (sizeof(x)*8-1))

kemm
02.09.2025 20:25не отличают процедуры от функций
И чем отличается процедура от функции, возвращающей void?
не понимают побочных эффектов (поскольку практически все сишные выражения - один сплошной побочный эффект)
Это можно сказать про любой императивный язык. Пока не пощупаешь какой-нибудь хаскель
С в силу своей ограниченности (отсутствие массивов, ... и пр.
А ещё там отсутствуют строки и utf, длинная арифметика, работа с изображениями, встроенная БД, интерфейс к чатгпт и автоматическое управление кофеваркой. И что? Кто сказал, что это всё нужно тащить в язык, а не в библиотеки?
а также нелогичного синтаксиса (указателей)
Что может быть логичнее, чем указатели?!

loropiana Автор
02.09.2025 20:25вообще не понял )) с каких пор у Си отсутствуют массивы и функции ? ))) Да, C не учит высоким абстракциям напрямую, зато отлично учит понимать, как работает компьютер. И после этого уже можно спокойно осваивать любые парадигмы.

foldr
02.09.2025 20:25Спасибо за подборку. Как раз думал освоить си, и первым делом пришла в голову Кериниган и Ричи, которую читали в универе

badsynt
02.09.2025 20:25K&R для начала действительно тяжеловато (скучновато) будет ( хотя уже была ученая степень).
А вот М.Уэйт, С. Прата, Д.Мартин, Язык Си. Руководство для начинающих. плюс дискетка с Turbo C зашло как по маслу. И картинки симпатичные, с юмором :) До сих пор при словах "переносимый язык" вспоминается большая буква С с ручкой для переноски.
Судя по тому, что за 30 лет наворотили в Windows, сейчас эта книжка наверное уже бесполезна...

Jijiki
02.09.2025 20:25смотрел такую книжку Expert C Programming: Deep Secrets, Peter van der Linden, последнее время если по азам то я бы посмотрел книжку Искусство программирования С, её оглавление частично есть в вики
есть еще книга по FreeBSD там тоже интересно, само устройство Линукс или Юникс, пока ставишь уже учишься как щас помню )
ну и еще 1 смотрел по С++ там книга про то что просто изучаем С++ через консольные игры, и там рассматриваются все аспекты языка, которых достаточно на момент изучения
компиляция программ на генту даст буст тоже, но это на любителя
можно попробовать еще сделать свой Wm это оказывается вполне реально после практики на Swing например, тоже даёт чуть знаний
по памяти и работой с памятью поможет освещение математики отрезков, это целый раздел оказывается есть книги где это рассматривается

loropiana Автор
02.09.2025 20:25Вот еще книга просто космос , но единственное что нашел только на Английском и это все таки тормозит чуть процесс чтения

DocHannibal
Мне очень зашла книга "Программирование на C в примерах и задачах", Васильева. В былу работы программистом микроконтроллеров очень помогла войти в курс дела. До этого толком языки вообще не знал.
loropiana Автор
Видел ее не раз , но че то как то руки не доходили изучить