практический способ выучить C? [закрыто]

10

Я хочу копаться в C и обычно, когда я хочу выучить новый язык, я думаю о простой / достижимой цели проекта, которая имеет какое-то практическое назначение (использовать API, автоматизировать задачу и т. Д ...)

Мне труднее придумать один для C, в основном потому, что все, что я прочитал, указывает на тот факт, что C в настоящее время в основном используется во встроенных системах и более сложных программных проектах, таких как операционные системы.

Указывает ли это на то, что мне не нужно изучать это или что мне просто нужно быть немного более запутанным в своей стратегии обучения?

Ссылки на практические учебные ресурсы? (учебник / как это дает конечный результат, который имеет какую-то цель / выгоды)

jondavidjohn
источник
3
Вы получите более разумные ответы, если расскажете нам, ПОЧЕМУ вы хотите изучать C?
zvrba
2
Я согласен с zvrba. C отлично подходит для низкоуровневых, быстрых вещей и для кода драйвера. Если вы пишете код для игр, это тоже замечательно (хотя вы, вероятно, будете работать с программистами C ++, которые будут жаловаться на вас за написание «нестандартного» кода). Я чувствую, однако, что Assembly и C похожи на латынь (в разговорных языках), они были не первыми, но большинство пришедших после них использовали идеи и конструкции из них для создания своих собственных языков. Таким образом, изучение C MIGHT даст вам лучшее понимание языков более высокого уровня
Джейми Тейлор
Вы проверили Zed Shaw's Learn C The Hard Way . Примерно настолько практично, насколько это возможно, и совершенно бесплатно.
Уайетт Барнетт
у человека с Python the Hard Way теперь есть книги для других языков, включая альфа-версию для C, я бы начал с этого. C - высокий уровень, большая разница с asm, я ненавижу сравнение с asm, поскольку оно неверно. Относительно уверен, что позволяет делать то, что не любят другие языки. Неважно, что вы хотите сделать, какое-либо приложение, которое вы можете написать на C, нет причин настраивать приложение на язык.
old_timer

Ответы:

27

Я бы просто порекомендовал взять копию Кернигана и языка программирования Ритчи Си (2-е издание) . В конце каждой главы есть ряд упражнений, которые вы можете выполнить, а также очень хорошее введение в язык Си. Это не сделает вас мастером языка, но в конце книги и упражнений у вас должно быть достаточно хорошее понимание, чтобы, возможно, найти проект с открытым исходным кодом, написанный на C, который вы могли бы прочитать и, возможно, внести свой вклад к.

Если вы хотите увидеть реальные реальные проекты с кодом на C в них. Становится все труднее - во многих проектах используется язык «более высокого уровня», но C все еще жив и здоров. Если вы хотите изучать C, не бойтесь изобретать велосипед, чтобы добиться обучения. Не очень хорошая идея изобретать решения в режиме реального времени, но это прекрасно для академического упражнения.

Томас Оуэнс
источник
1
Добавьте FAQ от comp.lang.c к этому. c-faq.com
Майк Шеррилл 'Cat Recall'
3
+1 за не против изобретать решения, чтобы учиться.
CVn
4
K & R ужасен для изучения хорошего стиля программирования в целом и ужасен для обучения безопасным / вменяемым практикам программирования C в частности. Все фрагменты кода внутри него в лучшем случае запутаны, в большинстве случаев они учат прямым опасным привычкам. Это устаревшая книга, я бы не рекомендовал ее ни для чего, кроме ностальгии. Это особенно не подходит для начинающих программистов.
2
@ Томас Да, второе издание. Вы можете привести практически любой фрагмент кода из него, и я могу указать на 2-3 опасных / плохих практических случая. Я открою книгу прямо сейчас и выберу случайный пример. Итак, мы идем, p119: присваивание внутри условий, использование собственных примитивных типов данных, использование неявного int (без знака), приведение типов к результату malloc (очень плохо!), Приведение параметра к типу free to void * (почему ??? ), несколько возвратов (иначе спагетти), используя NULL без правильного #include, если без {}.
2
+ 1 для KnR C. Это лучшее (и самое краткое) введение в программирование на конкретном языке, который я когда-либо читал. Как уже отмечали другие, это может быть немного сомнительно в некоторых местах - один совет, который я бы дал, заключается в следующем: если когда-либо существовало руководство по программированию, которое требовало, чтобы вы читали окружающий текст, это оно. Другие, вы можете, как правило, выяснить из блока кода, но эта книга требует, чтобы вы прочитали ее полностью, по крайней мере, один раз.
Джейми Тейлор
1

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

Используйте все доступные средства отладки памяти для используемой вами платформы. Для Linux есть Electric Fence, для Mac OS X - Guard Malloc. Также есть Valgrind, который поддерживает ряд операционных систем.

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

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

Модульное тестирование также помогает.

Майк Кроуфорд
источник
0

Я согласен с большинством людей здесь, что сегодня языки определяются поставленной задачей. Было время, когда у вас был ограниченный выбор в этом отношении. Сегодня C в основном используется в области встроенного / системного программирования, где требуется оптимизация кода. Вам нужно написать точные коды, чтобы получить максимум, потому что если вы когда-нибудь начнете использовать эту абстракцию, то базовый материал должен быть очень надежным. Я бы сказал, что вы пытаетесь обойти некоторые проекты с открытым исходным кодом GNU, такие как сам Linux или что-то, что требует разработчиков на Си. Попробуйте свои силы в этих проектах вместо того, чтобы писать что-то с нуля в C. Это, вероятно, лучший способ писать коды и изучать язык.

Nishant
источник
На самом деле, я сомневаюсь, что прыгнуть головой в устоявшийся, пусть даже незначительный, проект - это хороший способ начать изучение языка с нуля. Вы , вероятно , чтобы получить в пути над головой, а также будет иметь дополнительное бремя просто пытается ориентироваться код, даже если все , что вы намеревались сделать это понять , как код работает. В частности, ядро ​​операционной системы является невероятно сложным программным обеспечением.
CVn
Да, но я предполагаю, что спрашивающий действительно прошел книгу K & R или что-то в этом роде. Мне был рекомендован этот подход, когда я спросил на канале Python. Будет ли это отличаться в C?
Nishant
Строго говоря, я не знаю, сильно ли это отличается, но в C вам нужно уделять гораздо больше внимания мельчайшим деталям, чем в языке высокого уровня, таком как Python. Управление памятью, чтобы упомянуть только одну вещь. Прыжки в уже существующий, потенциально большой проект, когда вы только начинаете работать с языком, могут быть не лучшим способом сделать это.
CVn
0

Вы захотите сделать что-то, что может работать из командной строки. Программирование GUI на C - главная проблема в заднице, даже с хорошей структурой GUI.

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

C может использоваться для программирования общего назначения; вам просто нужно немного снизить свои ожидания (представьте, что сейчас 1983 год, и вы сидите перед VT52, подключенным к VAX 11/750, и вы будете в правильном настроении).

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


1 - В последней редакции языкового стандарта (2011 г.) добавлена ​​встроенная поддержка потоков

Джон Боде
источник
0

Я рекомендую Project Euler . Я использовал это, чтобы улучшить мой C ++, и это здорово. Это здорово, потому что каждая задача - это небольшая задача, выполнение которой может занять менее часа (по крайней мере, первые).

Вам понадобится профилировщик и книга об оптимизации кода для скорости. Обязательно придерживайтесь правила 1 минуты: вы должны получить ответ в течение 1 минуты.

Б Семь
источник
0

Если вы УЖЕ программист, и ПРОСТО ДОЛЖНЫ изучать C, и не против изучения более старой версии языка (ядро все равно почти такое же), то «C для программистов» Леендерта Аммереала не может быть лучше , Пройдите через это, начиная с конца.

Джон Р. Штром
источник