В данный момент появилось большое количество языков, которые позиционируют себя как иструменты для достижения различных целей, начиная от достижения memory safety, вплоть до абстракции от всего и управление этими примитивами. Тем не менее, язык С остается до сих пор востребованным. Этому есть несколько причин.
-
На этом языке написаны основные модули операционных систем
-
До сих пор множество программного обеспечения пишется наC , в частности для embedded-устройств. Так есть и будет долгое время.
-
Этот язык позволяет понять принципы работы с памятью, для того, чтобы избежать распространенных уязвимостей, которые могут привести к серьезным утечкам данных или system compromise. Да и просто из интереса.
-
Язык - статически типизированный. Что значит, что программа должна знать что конкретно вы от нее ожидаете. Var(присвоение типа динамически) и прочее не прокатит. Ты должен прекрасно понимать, ЧТО ты хочешь от программы.
-
Язык довольно простой для понимания.
Итак, Си. C — компилируемый статически типизированный язык программирования общего назначения, разработанный в 1969—1973 годах сотрудником Bell Labs Деннисом Ритчи как развитие языка Би (уперто с википедии). Отец C++ (тоже must-read) и объектно-ориентированных мейнстрим языков. Отсутствует garbage-collector и присутствуют указатели. Enjoy.
Если человек уже обладает знаниями языков, структур данных, алгоритмов, эта секция может быть опущена.
- Для *nix систем до сих пор лучшим компилятором остается gcc - http://gcc.gnu.org/.
- Для Windows - Microsoft Visual Studio - https://www.visualstudio.com/ru/.
Или более легковесная: MinGW http://www.mingw.org/ - IOs - Apple X Code - https://developer.apple.com/xcode/
- Межплатформенная - Qt - https://www.qt.io/download/
- Ну и для совсем ленивых - онлайн компилятор - https://www.tutorialspoint.com/codingground.htm
- Основы программирования - http://cppstudio.com/cat/271/273/.
- Типы данных - http://cppstudio.com/post/271/. На начальных уровнях достаточно понимать что такое bool, char, int и сколько места оно занимает (либо запомнить, что такое sizeof(..)).
- Конкретно структуры данных - https://habrahabr.ru/post/263765/. На начальных уровнях достаточно понимать, что такое лист и массив.
- Во-первых, необходимо проверить запятые, точки с запятой и прочее. Особенно есть вы пришли из Пайтона. Решает 90% проблем.
- Во-вторых, читать, что пишет компилятор. Иногда полезно.
- Во-вторых-с-половиной, совет от меня, иногда полезно руками (или мозгом, у кого что лучше работает) пробежаться по программе и посмотреть не только на то, то вы хотели написать, но и что вы написали. Си - глупый, он выполнит второе, первое пока не умеет.
- В-третьих, гугл. Вбить ошибку. Уже было. Уже проходили. Уже решили.
Вики-учебник - https://ru.wikibooks.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%A1%D0%B8_%D0%B2_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B0%D1%85
Курсы на Си - на русском - http://www.intuit.ru/studies/courses/97/97/info
Курсы на Си - на английском - https://www.coursera.org/courses?query=c%20programming
Для среднего уровня знания языка, кроме знания самих конструкций, я бы упомянула следующие темы:
-
Алгоритмы/структуры данных (в частности complexity и алгоритмы поиска): Thomas H. Cormen Introduction to Algorithms, 3rd Edition (MIT Press)
Steven S Skiena The Algorithm Design Manual -
Указатели: Richard M Reese Understanding and Using C Pointers: Core Techniques for Memory Management
-
Введение в ООП:
Что такое struct: https://www.tutorialspoint.com/cprogramming/c_structures.htm
Конструтор и деструктор: https://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm
xxx: Никакой интриги, убийца - деструктор :) -
Misc: Разница передачи параметров по указателю и по значению: http://younglinux.info/c/function.
Что такое immutable переменные и почему надо быть аккуратным со строками: https://ru.wikipedia.org/wiki/Const_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5).
Время жизни и области видимости переменных: https://msdn.microsoft.com/ru-ru/library/592xa3sk.aspx
Правила хорошего кода: https://habrahabr.ru/company/geekbrains/blog/270001/. Распечатать и выучить.
Для высокого уровня знания языка, я уже сделаю деление на специализации:
Высокое знание memory layout - что как и зачем. Как писать безопасный код - https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard
Peter Van der Linden, Expert C Programming. Deep C Secrets.
Почему и стоит ли: https://habrahabr.ru/post/275135/
The Linux Kernel Module Programming Guide: http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
Drivers: http://stackoverflow.com/questions/2222763/how-should-i-get-started-on-writing-device-drivers
Beginner's Guide To Embedded C Programming: https://www.amazon.com/Beginners-Guide-Embedded-Programming-Microcontroller/dp/1438231598 FPGA coding in C: http://stackoverflow.com/questions/5603285/c-to-hardware-compiler-hll-synthesis
Ваш вопрос уже был задан и на него уже ответили. Если гугл не помогает, советую следующие Вопросы-ответы - на русском http://www.cyberforum.ru/c-beginners/
Вопросы-ответы - на английском https://www.reddit.com/r/C_Programming/
Вместо заключения.
В целях соблюдения right management я не указывала ссылки на онлайн-хранилища, где можно скачать книги.
Вместо заключения[2].
Мое мнение может не соответствовать мнению остальных членов команды. Данная информация представлена только в образовательных целях.