практичний спосіб вивчити C? [зачинено]


10

Я хочу копатись на C і зазвичай, коли хочу вивчити нову мову, я думаю про просту / досяжну мету проекту, яка має певне практичне призначення (використовувати api, автоматизувати завдання тощо)

Мені важче придумати один для C, головним чином тому, що все, що я читаю, вказує на те, що основне використання C на даний момент - у вбудованих системах та більш складних програмних проектах, таких як операційні системи.

Чи вказує це на те, що мені не потрібно цього вчитися, або що мені просто потрібно бути трохи більш заплутаним у своїй стратегії навчання?

Посилання на практичні ресурси навчання? (підручник / як це дає кінцевий результат, який має певну мету / користь)


3
Ви отримаєте більш розумні відповіді, якщо зможете сказати, ЧОМУ ви хочете вивчити C?
zvrba

2
Я згоден із zvrba. C відмінно підходить для швидкого та низького рівня, а також для коду драйвера. Якщо ви пишете код для ігор, це також чудово (хоча, ви, ймовірно, працюєте з кодерами C ++, які скарзяться на вас за написання "нестандартного" коду). Я думаю, що асамблея та С схожі на латинську (розмовними мовами), вони були не першими, але більшість, хто прийшов після них, використовували ідеї та конструкції з них для створення своїх власних мов. Таким чином, вивчення C MIGHT дозволяє краще зрозуміти мови вищого рівня
Джеймі Тейлор

Ви перевірили Learn C Zed Shaw's Learn C The Hard Way . Настільки ж практичний, як можна отримати, і зовсім безкоштовно.
Wyatt Barnett

У користувача Python Hard Way в даний час є книги для інших мов, включаючи альфа-версію для C, я б почав з них. C - це високий рівень, велика різниця до asm, я ненавиджу порівняння з asm, оскільки це помилково. Щодо впевненого, це дозволяє вам робити те, що інші мови не мають. Не має значення, яку ви хочете зробити будь-яку програму, яку ви можете написати на C, немає причин орієнтувати програму на мову.
old_timer

Відповіді:


27

Я б просто рекомендував забрати копію програми мови програмування Керніган та Річі (2-е видання) . У кінці кожної глави є ряд вправ, які ви можете виконати, а також ви можете дуже добре ознайомитись з мовою С. Це не зробить вас майстром мови, але вам слід досить добре зрозуміти в кінці книги та вправ, щоб, можливо, знайти проект з відкритим кодом, написаний на C, до якого ви могли прочитати джерело і, можливо, внести свій внесок до.

Якщо ви хочете побачити реальні проекти в реальному світі з кодом С у них. Це стає все складніше - багато проектів використовують мову "вищого рівня", але C все ще живий і б'є. Якщо ви хочете вивчити C, не бійтеся винаходити колесо для досягнення навчання. Не винаходити винаходити рішення на годиннику, але це прекрасно, як зробити це як академічна вправа.


1
Додайте до цього FAQ з comp.lang.c. c-faq.com
Майк Шеррілл 'Відкликання котів'

3
+1 - не проти винаходити рішення, щоб навчитися.
CVn

4
K&R жахливо вивчати хороший стиль програмування взагалі, і жахливо навчати практиці безпечного / здорового програмування C. Усі фрагменти коду, що знаходяться всередині нього, в кращому випадку затуманені, більшість часу вони навчають відвертим небезпечним звичкам. Це застаріла книга, я б не рекомендував її для нічого, крім ностальгії. Це особливо не підходить для початківців програмістів.

2
@Thomas Так, друге видання. Ви можете цитувати з нього майже будь-який фрагмент коду, і я можу вказати на нього 2-3 небезпечних / поганих випадків практики. Я зараз відкрию книгу і виберу якийсь випадковий приклад. Добре, ми підемо, p119: присвоєння внутрішнім умовам, використання нативних примітивних типів даних, використання неявного int (без підпису), введення результату malloc (дуже погано!), Введення параметра в вільний до недійсного * (чому ??? ), кілька повернень (ака спагетті), використовуючи NULL без належного #include, якщо без {}.

2
+ 1для KnR C. Це найкраще (і найкоротше) введення в програмування певною мовою, яку я коли-небудь читав. Як зазначали інші, це може бути дещо сумнівно на місцях - одна порада, яку я б дав, така: якщо коли-небудь був посібник з програмування, який вимагав би прочитати навколишнє розмиття, це все. Зазвичай ви можете розібратися з кодового блоку, але ця книга вимагає, щоб ви прочитали її з обкладинки на обкладинку, принаймні, один раз.
Джеймі Тейлор

1

Вам доведеться реально зрозуміти розподіл пам'яті. Вам здається, що раніше ви використовували інші мови, але цілком ймовірно, що ці інші мови приховували від вас гострі деталі управління пам’яттю. У С керування пам'яттю завжди явне. У цьому є деякі переваги, але це означає, що ви повинні бути обережними, щоб виправити це правильно, інакше пекло зламається.

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

Якщо ви не зможете звільнити пам'ять, яку слід звільнити, у вас з’явиться витік пам'яті. Продовжуйте це робити, і вам не вистачить пам’яті. Навіть у магазині резервного копіювання (те, що більшість людей називають віртуальною пам'яттю), ви можете змусити систему надмірно розміщувати сторінки або навіть не вистачати місця для обміну.

Якщо ви звільнили вже звільнену пам'ять, ви зіпсуєте купу і впадете, але, ймовірно, не відразу. Ви також пошкодите купу, якщо перекриєте буфер. Інструменти налагодження пам'яті допоможуть у всьому цьому.

Тестування одиниць також допомагає.


0

Я згоден з більшістю людей тут, що сьогодні мови визначаються заданим завданням. Був час, коли ви мали обмежений вибір у цьому плані. Сьогодні C в основному використовується у домені програмування Embedded / System, де є необхідність в оптимізації коду. Вам потрібно написати точні коди, щоб отримати максимум, тому що якщо ви коли-небудь почнете використовувати цю абстракцію, то базовий матеріал повинен бути дуже надійним. Я б сказав, що ви намагаєтеся обійти деякі проекти з відкритим кодом GNU, такі як сам Linux або щось, що потрібно розробникам C. Спробуйте свої сили в цих проектах, а не писати щось з нуля на С. Це, мабуть, кращий спосіб писати коди та вивчати мову.


Насправді, я сумніваюся, що стрибнути головою спочатку в усталений, навіть якщо незначний, проект - це хороший спосіб почати вивчати мову з нуля. Ви, швидше за все, переступите над головою, а також матимете додатковий тягар простої спроби орієнтуватися в коді, навіть якщо все, що ви вирішили зробити, - це зрозуміти, як працює код. Зокрема, ядро ​​операційної системи - це надзвичайно складна частина програмного забезпечення.
CVn

Так, але я припускаю, що запитуючий фактично пережив книгу K&R або щось подібне. Мені рекомендували такий підхід, коли я запитав на каналі Python. Чи було б це різницею в C?
Нішант

Власне кажучи, я не знаю, чи було б це набагато інакше, але в С, вам потрібно приділяти набагато більше уваги деталям з дрібкою-дрібкою, ніж мовою високого рівня, наприклад, Python. Управління пам'яттю, кажучи лише про одне . Стрибки в усталений потенційно великий проект, коли ви тільки починаєте роботу з мовою, може бути не найкращим способом це зробити.
CVn

0

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

Моєю звичайною пропозицією щодо практичного досвіду навчання C був список контактів чи інший простий додаток для управління даними. Це охоплює більшість важливих бітів (введення / виведення, управління пам'яттю, обробка тексту тощо), і вам не доведеться використовувати що-небудь за межами стандартної бібліотеки С для її виконання. C не має вбудованої підтримки для графіки, мереж, звуку чи багато іншого 1 , тому для вашого першого находу на програмування C краще уникати всього, що покладається на такі речі.

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

Пам'ятайте лише, у C немає захисних щитків і не завадить зробити щось дурне. Визначення мови місцями мало розпущене, і є деякі операції, які не є незаконними як такі, але також не є чітко визначеними.


1 - Остання редакція мовного стандарту (2011 р.) Додала вбудовану підтримку для нарізки


0

Я рекомендую Project Euler . Я використовував його для вдосконалення свого C ++, і це приголомшливо. Це чудово, тому що кожна проблема - це невелике завдання, яке може зайняти менше години (хоча б перші).

Вам знадобиться профайлер і книга про оптимізацію коду для швидкості. Обов’язково дотримуйтесь правила 1 хвилини: Відповідь ви повинні отримати протягом 1 хвилини.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.