praktyczny sposób na naukę C? [Zamknięte]

10

Chcę zagłębić się w C i zwykle, gdy chcę nauczyć się nowego języka, myślę o prostym / osiągalnym celu projektu, który ma jakiś praktyczny cel (skorzystaj z interfejsu API, zautomatyzuj zadanie itp.)

Trudno mi wymyślić jeden dla C, głównie dlatego, że wszystko, co czytam, wskazuje na to, że główne użycie C obecnie jest w systemach wbudowanych i bardziej złożonych projektach oprogramowania, takich jak systemy operacyjne.

Czy to wskazuje mi na to, że nie muszę się tego uczyć lub że muszę być nieco bardziej zagmatwany w mojej strategii uczenia się?

Odniesienia do praktycznych zasobów edukacyjnych? (samouczek / jak to daje wynik końcowy, który ma jakiś cel / benifit)

jondavidjohn
źródło
3
Otrzymasz bardziej sensowne odpowiedzi, jeśli możesz nam powiedzieć DLACZEGO chcesz się nauczyć C?
zvrba
2
Zgadzam się z Zvrba. C jest świetny do szybkiego, niskiego poziomu i do kodu sterownika. Jeśli piszesz kod do gier, jest również świetny (chociaż prawdopodobnie będziesz współpracował z programistami C ++, którzy będą narzekać na ciebie za pisanie „niestandardowego” kodu). Wydaje mi się jednak, że Zgromadzenie i C są podobne do łaciny (w językach mówionych), nie były pierwsze, ale większość, która pojawiła się po nich, wykorzystała ich pomysły i konstrukcje do stworzenia własnych języków. Tak więc studiowanie C MIGHT pozwala lepiej zrozumieć języki wyższego poziomu
Jamie Taylor
Czy sprawdziłeś Zed Shaw's Learn C The Hard Way . Mniej więcej tak praktyczny, jak to tylko możliwe, i zupełnie za darmo.
Wyatt Barnett
osoba z Python the Hard Way ma teraz książki dla innych języków, w tym wersję alfa dla C, zacznę od tego. C to wysoki poziom, duża różnica w stosunku do asm, nienawidzę porównania do asm, ponieważ jest to fałsz. Stosunkowo pewna, że ​​pozwala ci robić to, czego nie robią inne języki. Nie ma znaczenia, co chcesz zrobić w dowolnej aplikacji napisanej w C, nie ma powodu, aby kierować aplikację na język.
old_timer

Odpowiedzi:

27

Po prostu polecam zabranie kopii Kernighana i Ritchie's The C Programming Language (2nd Edition) . Na końcu każdego rozdziału znajduje się kilka ćwiczeń, które można wykonać, a także bardzo dobre wprowadzenie do języka C. Nie uczyni cię mistrzem języka, ale powinieneś mieć wystarczającą wiedzę na końcu książki i ćwiczeń, aby być może znaleźć projekt open source napisany w C , do którego możesz przeczytać źródło i być może przyczynić się do.

Jeśli chcesz zobaczyć rzeczywiste projekty z kodem C. Robi się coraz trudniej - wiele projektów używa języka „wyższego poziomu”, ale C wciąż żyje i ma się dobrze. Jeśli chcesz nauczyć się C, nie bój się odkrywać koła, aby osiągnąć naukę. Nie jest dobrym pomysłem wymyślanie na nowo rozwiązań na czas, ale jest to całkiem w porządku, jeśli robisz to jako ćwiczenie akademickie.

Thomas Owens
źródło
1
Dodaj do tego FAQ z comp.lang.c. c-faq.com
Mike Sherrill „Cat Recall”
3
+1 za nie przejmuj się nowymi rozwiązaniami, aby się uczyć.
CVn
4
K&R jest straszny w nauce dobrego stylu programowania, a szczególnie w nauczaniu bezpiecznych / zdrowych praktyk programowania C. Wszystkie fragmenty kodu są w najlepszym razie zaciemnione, przez większość czasu uczą wręcz niebezpiecznych nawyków. Jest to przestarzała książka, nie polecałabym jej dla niczego poza nostalgią. Jest to szczególnie nieodpowiednie dla początkujących programistów.
2
@Thomas Tak 2. edycja. Możesz przytoczyć z niego niemal dowolny fragment kodu i prawdopodobnie mogę wskazać 2-3 niebezpieczne / słabe praktyki. Teraz otworzę książkę i wybiorę jakiś przypadkowy przykład. Ok, zaczynamy, p119: przypisanie warunków wewnętrznych, użycie natywnych pierwotnych typów danych, użycie niejawnej int (niepodpisany), rzutowanie wyniku malloc (bardzo źle!), Rzutowanie parametru w celu unieważnienia * (dlaczego ??? ), wielokrotne zwroty (inaczej spaghetti), użycie NULL bez właściwego #include, jeśli bez {}.
2
+ 1 dla KnR C. To najlepsze (i najbardziej zwięzłe) wprowadzenie do programowania w określonym języku, jaki kiedykolwiek czytałem. Jak zauważyli inni, może to być trochę wątpliwe w niektórych miejscach - jedyna rada, którą udzieliłem, jest następująca: jeśli kiedykolwiek istniała instrukcja programowania, która wymagała od ciebie przeczytania otaczającego napisu, to jest to. Inne, które zazwyczaj możesz rozszyfrować z bloku kodu, ale ta książka wymaga przeczytania jej od początku do końca przynajmniej raz.
Jamie Taylor
1

Musisz naprawdę zrozumieć alokację pamięci. Brzmisz, jakbyś używał wcześniej innych języków, ale są szanse, że te inne języki ukryły przed tobą krwawe szczegóły zarządzania pamięcią. W C zarządzanie pamięcią jest zawsze jawne. Ma to kilka zalet, ale oznacza to, że musisz uważać, aby to zrobić dobrze, inaczej całe piekło się rozpuści.

Używaj wszelkich dostępnych narzędzi do debugowania pamięci dla używanej platformy. W systemie Linux dostępny jest Electric Fence, w Mac OS X Guard Guardoc. Istnieje również Valgrind, który obsługuje wiele systemów operacyjnych.

Jeśli nie zwolnisz pamięci, którą należy zwolnić, nastąpi wyciek pamięci. Rób to dalej, a zabraknie ci pamięci. Nawet w sklepie z kopiami zapasowymi (co większość ludzi nazywa pamięcią wirtualną) możesz spowodować, że system będzie nadmiernie stronicowany lub nawet zabraknie miejsca na wymianę.

Jeśli zwolnisz pamięć, która została już zwolniona, zniszczysz stertę i ulegniesz awarii, ale prawdopodobnie nie od razu. Zniszczysz też stertę, jeśli przekroczysz bufor. Narzędzia do debugowania pamięci pomogą w tym wszystkim.

Pomaga również testowanie jednostkowe.

Mike Crawford
źródło
0

Zgadzam się z większością ludzi, że dzisiejsze języki zależą od zadania. Był czas, kiedy miałeś ograniczony wybór w tym zakresie. Obecnie C jest używany głównie w domenie programistycznej Embedded / System, gdzie istnieje potrzeba optymalizacji kodu. Musisz napisać precyzyjne kody, aby uzyskać maksimum, ponieważ jeśli zaczniesz używać tej abstrakcji, to podstawowe elementy muszą być bardzo solidne. Powiedziałbym, że próbujesz obejść niektóre projekty GNU typu open source, takie jak sam Linux lub coś, co wymaga programistów C. Spróbuj swoich sił w tych projektach zamiast pisać coś od zera w C. Jest to prawdopodobnie lepszy sposób na pisanie kodów i naukę języka.

Nishant
źródło
Właściwie wątpię, aby najpierw wskoczyć do ustalonego, choć niewielkiego projektu, dobrym sposobem na rozpoczęcie nauki języka od podstaw. Jesteś prawdopodobne, aby uzyskać w drodze nad głową, a także będzie mieć dodatkowy ciężar po prostu stara się poruszać kodu, nawet jeśli wszystko, co określone zrobić, to zrozumienie , jak działa kod. W szczególności jądro systemu operacyjnego jest niezwykle złożonym oprogramowaniem.
CVn
Tak, ale zakładam, że pytający rzeczywiście przejrzał książkę K&R lub coś podobnego. Takie podejście polecono mi, gdy zapytałem na kanale Python. Czy byłoby inaczej w C?
Nishant,
Ściśle mówiąc, nie wiem, czy byłoby inaczej, ale w C musisz zwrócić większą uwagę na drobiazgowe szczegóły niż w języku wysokiego poziomu, takim jak Python. Zarządzanie pamięcią, żeby wymienić tylko jedną rzecz. Skakanie do uznanego, potencjalnie dużego projektu, gdy dopiero zaczynasz pracę z językiem, może nie być najlepszym sposobem na zrobienie tego.
CVn
0

Będziesz chciał zrobić coś, co może działać z wiersza poleceń. Programowanie GUI w C jest poważnym problemem w dupie, nawet przy dobrym frameworku GUI.

Moją zwykłą propozycją praktycznego uczenia się języka C była lista kontaktów lub inna prosta aplikacja do zarządzania danymi. To obejmie większość ważnych bitów (I / O, zarządzanie pamięcią, przetwarzanie tekstu itp.) I do tego nie będziesz musiał używać niczego poza standardową biblioteką C. C nie ma żadnej wbudowanej obsługi grafiki, sieci, dźwięku ani wielu innych elementów 1 , więc na pierwszy rzut oka na programowanie w C najlepiej jest unikać wszystkiego, co opiera się na tego rodzaju rzeczach.

C można wykorzystać do programowania ogólnego; musisz nieco sprecyzować swoje oczekiwania (wyobraź sobie, że jest 1983 rok i siedzisz przed VT52 podłączonym do VAX 11/750, i będziesz miał właściwy sposób myślenia).

Pamiętaj tylko, że C nie ma strażników ostrzy i nie powstrzyma cię przed zrobieniem czegoś głupiego. Definicja języka jest nieco luźna, a niektóre operacje nie są jako takie nielegalne , ale też nie są dobrze zdefiniowane.


1 - W najnowszej (2011) wersji standardu językowego dodano obsługę wątków

John Bode
źródło
0

Polecam Project Euler . Użyłem go do ulepszenia mojego C ++ i jest niesamowity. Jest świetny, ponieważ każdy problem jest niewielkim zadaniem, którego ukończenie może zająć mniej niż godzinę (przynajmniej te pierwsze).

Potrzebujesz profilera i książki o optymalizacji kodu pod kątem szybkości. Przestrzegaj zasady 1 minuty: musisz uzyskać odpowiedź w ciągu 1 minuty.

B Seven
źródło
0

Jeśli JUŻ JESTEŚ programistą, a TYLKO musisz nauczyć się języka C i nie przeszkadza ci w nauce starszej wersji języka (rdzeń jest nadal prawie taki sam), to Leendert Ammeraal w „C dla programistów” nie można pokonać . Pracuj przez to, od początku do końca.

John R. Strohm
źródło