Мой набор
Мой набор

Когда я начинал изучать C, я сразу взялся за «библию» — «Язык программирования С» Брайана Кернигана и Денниса Ритчи.

Все советуют её первой книгой, и казалось бы, куда ещё? Но честно скажу — она зашла мне очень тяжело. Подходы, структура, хронология изложения — всё это оказалось непростым для полного новичка. Возможно, дело во мне, но как первая книга я бы её не рекомендовал.

«C для программиста с введением в С11» — Пол и Харви Дейтел

Эта книга стала для меня переломной. Я прочитал её за неделю, и именно здесь начал понимать, что и зачем делаю. Она системная, структурная и очень дружелюбная к читателю. После неё многие вещи в C перестали казаться магией.

Конечно, я смотрел видеоуроки и разборы, но они скорее закрепляли материал, чем заменяли книгу.

Второй заход на Кернигана и Ритчи

После Дейтелов я снова взял в руки «Язык программирования С» — и вот тут всё встало на свои места.

Там я уже находил не новые понятия, а другие подходы к реализации, полезные нюансы. Книга открылась с другой стороны: как настольное пособие для практикующего, а не как вводный курс.

«Язык C в 21 веке» — Бен Клеменс

Эта книга — просто хорошее современное введение. Легко читается, не перегружена, и в то же время освещает актуальные вещи. Лишней точно не будет.

«Язык C. Мастерство программирования: принципы, практики и паттерны» — Кристофер Прешерн

Вот здесь начинается уровень «продвинутый практик». Книга помогает не просто писать рабочий код, а думать о стиле, паттернах и архитектуре на C. Особенно интересно её читать параллельно с «Грокаем алгоритмы»Адитьи Бхаргавы. Эта связка даёт и алгоритмическое мышление, и инженерный подход.

Итог

  • Керниган Ритчи — классика, но тяжеловата как первая книга. Лучше вернуться к ней чуть позже.

  • Дейтелы — отличный старт для тех, кто хочет войти в язык без лишнего страха.

  • Клеменс и Прешерн — книги, которые развивают дальше и дают глубину.

  • Видео и статьи — хорошее дополнение, но основа у меня всё равно в книгах.


Каждый идёт своим путём, и, возможно, кто-то «проглотит» K&R с первого раза. Но если у вас не получилось — это нормально. Главное — найти материал, который «зайдёт» именно вам.

В комментариях посоветуйте хорошую литературу именно под Си пожалуйста

Комментарии (39)


  1. DocHannibal
    02.09.2025 20:25

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


    1. loropiana Автор
      02.09.2025 20:25

      Видел ее не раз , но че то как то руки не доходили изучить


  1. dyadyaSerezha
    02.09.2025 20:25

    Как почти всегда, нет введения с объяснением, почему полный новичок решил изучить С. А было бы интересно.

    Автор, а почему a[5] и 5[a] это одно и то же? Или не одно? )


  1. Serpentine
    02.09.2025 20:25

    Все советуют её первой книгой, и казалось бы, куда ещё?

    Кто эти «все» и «кому» они советуют? В аннотации от издательства и в авторском предисловии к K&R чёрным по русскому написано:

    Книга не рекомендуется для чтения новичкам; для своего изучения она требует знания основ программирования и вычислительной техники.


    1. edo1h
      02.09.2025 20:25

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


      1. Serpentine
        02.09.2025 20:25

        Ваш комментарий и еще один ниже внезапно (!) никак не противоречат приведенной мной цитате. Зато она видимо обидела кого-то.

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


        1. unreal_undead2
          02.09.2025 20:25

          отличается от сферического новичка в вакууме

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


    1. Siemargl
      02.09.2025 20:25

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


  1. WindShear
    02.09.2025 20:25

    1. atues
      02.09.2025 20:25

      Недурная книга для начинающих, НО только следует иметь в виду, что в ней описывается старая-престарая версия С (по первому изданию K&R). Кроме того, раздел по указателям и структурам (а это, в сущности, то, что составляет самый смак в языке) изложен конспективно. Я, все-таки, не рекомендовал бы ее.

      Несмотря на угрожающие размеры, книги Прата и Дейтела мне кажутся куда лучше. Они, порой, утомляют чересчур подробным и детализированным изложением, но они соответствуют в целом современному С. К тому же примеры и упражнения в них полезнее и богаче.

      P.S. И по-любому, K&R обязан прочесть любой сишник :) Пусть не самой первой, но обязательно


      1. WindShear
        02.09.2025 20:25

        Так человек, вроде, как раз с нуля и начинает. Она, а затем и K&R можно )


  1. morgot
    02.09.2025 20:25

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


    1. atues
      02.09.2025 20:25

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


      1. SpiderEkb
        02.09.2025 20:25

        Тоже начинал с него, но перевод не помню уже. Это был 1989-90гг.

        Дальше уже, конечно были более серьезные книги, но легко вникнуть в основные понятия и концепции языка помогла именно книга Прата.


      1. morgot
        02.09.2025 20:25

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


  1. atues
    02.09.2025 20:25

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


  1. unreal_undead2
    02.09.2025 20:25

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


  1. peg59
    02.09.2025 20:25

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


    1. atues
      02.09.2025 20:25

      Какие ваши доказательства? )))

      Собственный опыт?


    1. loropiana Автор
      02.09.2025 20:25

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


    1. edo1h
      02.09.2025 20:25

      заработать сишность головного мозга

      объясните что вы имеете в виду


      1. peg59
        02.09.2025 20:25

        Сишники не отличают процедуры от функций, не понимают побочных эффектов (поскольку практически все сишные выражения - один сплошной побочный эффект).

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


        1. edo1h
          02.09.2025 20:25

          зато си формирует правильные представления о том как код исполняется. никакой магии, всё максимально близко к железу.

          Сишники не отличают процедуры от функций

          а в чём это отличие? чем плохо использование функции, не возвращающей значение?


        1. atues
          02.09.2025 20:25

          Даже? Ну, разумеется, в С нет разделения на процедуры и функции, но аналогом процедуры может служить функция, возвращающая void. Подскажите, насколько это критично - отсутствие понятия процедур в С? В java нет ни функций, ни процедур, только методы, но это, простите те же яйца, только сбоку и никому не мешает.

          То, что некоторые сишники не понимают побочных эффектов, так это свойственно не только им. Они могут быть в любом распространенном ЯП. Может и есть ЯП, где эта фишка заколочена наглухо (единственное, что приходит на ум - rust), то это исключение из правил. Да, хорошо бы без них, но что имеем, то имеем. Думать просто надо, когда пишешь код. Это - сложно и скучно и не всем по душе.

          Вложенные функции ни разу не понадобились. Их удобства я нисколько не отрицаю, но это точно не критично.

          А вот насчет отсутствия массивов в С: если не трудно, подробнее можно?

          Касаемо указателей. Да, это камень преткновения. Многие не могут понять, что значение и адрес значения - разные вещи. Можно без них программировать? Ессно: java, c# к примеру. Ну и пользуйте их на здоровье. Но в С (а тем более, в ассемблере, откуда косвенная адресация и пришла) без них плохо получается


          1. peg59
            02.09.2025 20:25

            Понадобилось - не понадобилось, речь вообще не об этом. Побочные эффекты в других ЯП тоже не аргумент (вообще избавиться от побочных эффектов невозможно). Сам стиль программы на С, состоящей практически полностью из побочных эффектов (и по-другому не написать), травмирует мышление начинающего.

            Насчет отсутствия массивов. Я плохо умею объяснять. Вот, скажем, массив

            int p[20];

            А теперь мы пишем *(p + 5) = 12; Так правильно?

            Или всё-таки p[5] = 12; ?

            Я тут вижу имитацию массива указателями.

            А вообще, рекомендую почитать А.В. Столяров, "Язык С и начальное обучение программированию".


            1. atues
              02.09.2025 20:25

              То Вы против С, то рекомендуете книгу Столярова (хорошая, кстати).

              Я тоже не считаю, что С - это то, с чего следует начинать учиться. Этот язык для уже что-то понимающих


            1. atues
              02.09.2025 20:25

              int 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). Но массивы входят в определение ядра языка (как и структуры, перечисления, объединения)


              1. peg59
                02.09.2025 20:25

                У Столярова хорошо изложено. Я только ухудаю.

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


                1. atues
                  02.09.2025 20:25

                  Знаете, нет предела извращениям. Вот, например, функция, которая находит минимальное из двух целых (для общности пишу на псевдокоде):

                  min(a, b) = (a + b - abs(a-b)) >> 2

                  Ни одного if-а, заметьте. Но за такой код надо руки отрывать начиная от колен :) И тройные указатели встречались. Но это не значит, что так надо делать. Можно? Да. Нужно? Нет


                  1. kolezz
                    02.09.2025 20:25

                    Ну, во-первых, а покажите abs без if-а. Если if-а не видно, то это не значит, что его нет.

                    Во-вторых, вы уверены, что >> 2 ? Деление на 2 - это >> 1.
                    А вообще красивый if. Я такого раньше не встречал. Только с переполнением у него плохо...


                    1. unreal_undead2
                      02.09.2025 20:25

                      а покажите abs без if-а.

                      Навскидку (x ^ (x >> (sizeof(x)*8-1))) - (x >> (sizeof(x)*8-1))


                      1. kolezz
                        02.09.2025 20:25

                        Офигенно! Я в блаженстве.


                    1. atues
                      02.09.2025 20:25

                      Да, конечно :))) Сдвиг на 1 должен быть. ОписАлся


        1. kemm
          02.09.2025 20:25

          не отличают процедуры от функций

          И чем отличается процедура от функции, возвращающей void?

          не понимают побочных эффектов (поскольку практически все сишные выражения - один сплошной побочный эффект)

          Это можно сказать про любой императивный язык. Пока не пощупаешь какой-нибудь хаскель

          С в силу своей ограниченности (отсутствие массивов, ... и пр.

          А ещё там отсутствуют строки и utf, длинная арифметика, работа с изображениями, встроенная БД, интерфейс к чатгпт и автоматическое управление кофеваркой. И что? Кто сказал, что это всё нужно тащить в язык, а не в библиотеки?

          а также нелогичного синтаксиса (указателей)

          Что может быть логичнее, чем указатели?!


        1. loropiana Автор
          02.09.2025 20:25

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


  1. foldr
    02.09.2025 20:25

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


  1. badsynt
    02.09.2025 20:25

    K&R для начала действительно тяжеловато (скучновато) будет ( хотя уже была ученая степень).

    А вот М.Уэйт, С. Прата, Д.Мартин, Язык Си. Руководство для начинающих. плюс дискетка с Turbo C зашло как по маслу.  И картинки симпатичные, с юмором :) До сих пор при словах "переносимый язык" вспоминается большая буква С с ручкой для переноски.

    Судя по тому, что за 30 лет наворотили в Windows, сейчас эта книжка наверное уже бесполезна...


  1. Jijiki
    02.09.2025 20:25

    смотрел такую книжку Expert C Programming: Deep Secrets, Peter van der Linden, последнее время если по азам то я бы посмотрел книжку Искусство программирования С, её оглавление частично есть в вики

    есть еще книга по FreeBSD там тоже интересно, само устройство Линукс или Юникс, пока ставишь уже учишься как щас помню )

    ну и еще 1 смотрел по С++ там книга про то что просто изучаем С++ через консольные игры, и там рассматриваются все аспекты языка, которых достаточно на момент изучения

    компиляция программ на генту даст буст тоже, но это на любителя

    можно попробовать еще сделать свой Wm это оказывается вполне реально после практики на Swing например, тоже даёт чуть знаний

    по памяти и работой с памятью поможет освещение математики отрезков, это целый раздел оказывается есть книги где это рассматривается


  1. loropiana Автор
    02.09.2025 20:25

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