Nauka języka C

0

Witam wszystkich. Na wstępie chciałem zaznaczyć że jestem tu nowy. Bardzo chciałbym nauczyć się programować w języku C i tu moje pytanie. Skąd czerpać najlepiej wiedzę? Dodam że kompletnie nic nie umiem i chciałbym zacząć od podstaw. Polecacie jakieś książki może fora internetowe? I drugie pytanie czy język C pomaga w nauce innych języków?

0

Jeśli chodzi o język C, to jest to chyba najlepszy kurs w polskiej sieci.
https://pl.wikibooks.org/wiki/C

Tak, znajomość języka C zdecydowania pomaga w nauce innych języków programowania, a także pomaga w pisaniu lepszego i szybszego kodu.

1

A dlaczego wybrałeś język C? Jest to język przeznaczony do dosyć wąskiej grupy oprogramowania.

Znakomita książka dla początkujących (tak samo jak edycja dotycząca C++):
http://helion.pl/ksiazki/jezyk-c-szkola-programowania-wydanie-vi-stephen-prata,jcszp6.htm

0

Mogę polecić, oprócz powyższej:

  1. Język ANSI C. Programowanie. Wydanie II - Brian W. Kernighan, Dennis M. Ritchie
  2. Programowanie w C. Sprytne podejście do trudnych zagadnień, których wolałbyś unikać (takich jak język C) - Zed A. Shaw

Internetowe kursy języka C pokazują zazwyczaj prostą semantykę języka, pomijając większość kluczowych zagadnień, takich jak działanie kompilatora, czy skromną bibliotekę tego języka.

1

Tak, C pomaga w nauce innych języków, bo masa innych języków ma bardzo podobną składnię do niego. Choć nauka innego języka niż C też pomoże w nauce innych języków, ale być może w mniejszym stopniu poprzez np. duże różnice w składni.

0

Czemu chcesz zaczynać od języka C? Jest bardzo trudny jak na początek. Przynajmniej w dzisiejszych czasach. Wybierz sobie jakiś prostszy język, np. C#. Jak w nim ogarniesz o co chodzi w programowaniu, to wtedy możesz zejść do C.

9

C warto znać na tej samej zasadzie co ASM.
W C możesz zrobić dowolny soft - wystarczy dużo silnej woli.
W innych językach, nawet jeśli jesteś biegły, niektórych rzeczy nie dasz rady zrobić.
Można np. się ograniczyć do stacku webdev (typu PHP + JavaScript + CSS + HTML), ale wtedy taki osobnik nie powinien się nazywać programistą (może jakimś inżynierem ds. aplikacji webowych).
Wg mnie książka Prata jest przesadzona. 1024 strony o tym języku brzmi jak okrutny żart ("przeczytaj to a potem już wszystko będzie dla Ciebie banałem"). To sporo za dużo jak na książkę o podstawach.

Od siebie polecam niezmiennie K&R (328 stron) - http://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm
chociaż dzisiaj może być już lekko nieaktualna.

0

Też polecę jak kolega @vpiotr K&R jak dla mnie nie ma lepszej książki fajnie wprowadzającej w tematykę języka C.

1

@vpiotr: Cała prawda. C bardzo dobrze znać. Poza tym dla mnie C ma w sobie tę niskopoziomowość, która kiedyś strasznie mi się podobała. Uwielbiałem bawić się zarządzaniem pamięcią i wskaźnikami. Wiele się dzięki temu nauczyłem. Później idąc w języki wysokopoziomowe widać w jakim kierunku to wszystko wyewoluowało. Nie masz problemu ze zrozumieniem takich rzeczy jak typ referencyjny czy typ wartościowy w takim C#. Znając C można sobie ich działanie odpowiednio skojarzyć. Nauczysz się wykrywać wycieki pamięci za pomocą valgrind, a co za tym idzie dobrze pamięcią zarządzać.

Zobaczysz jak np. dynamiczna alokacja pamięci za pomocą malloc i free w C wyewoluowała do postaci new i delete w C++ aż po gołe new w językach wysokiego poziomu. Przekonasz się na własne oczy czym grozi przesyłanie wielkich obiektów przez wartość zamiast przez wskaźnik. Tego w językach wysokopoziomowych nie widać, bo np. klasa jest tam z definicji typem referencyjnym. Mnóstwo jest zalet takiej nauki.

Dla mnie np. było to fascynujące.

0

Napisz na priv.

Ewentualnie pogadamy na irc I polecę Ci to i owo.

Pzdr.

0

Podbijam, od jakich książek/ materiałów warto zacząć naukę języka C ? Może wątek już trochę umarł, więc myślę iż warto odświeżyć :)

1
Ozymandias napisał(a):

Podbijam, od jakich książek/ materiałów warto zacząć naukę języka C ? Może wątek już trochę umarł, więc myślę iż warto odświeżyć :)

Zamiast pobijać, wystarczy przeczytać wyżej napisane odpowiedzi...
Podałem tam link -> https://pl.wikibooks.org/wiki/C

0

Dziękuję :)

1
Kacpib18 napisał(a):

I drugie pytanie czy język C pomaga w nauce innych języków?

Trochę pomaga, trochę przeszkadza. C niestety uczy myśłenia o wielu bzdurkach, które nie są istotne dla programowania w językach wysokiego poziomu.
Do dzisiaj mam alergię na kod w C++ pisany przez programistów C. (wskaźniki i makra).
(A kiedyś widziałem nawet trochę takiej javy).

0

Do programowania w języku C niezbędny jest Linux ?

0
Ozymandias napisał(a):

Do programowania w języku C niezbędny jest Linux ?

Dziękuję :)

0

Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e

1
prototype napisał(a):

Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e

XD

C jest mniej rozbudowanym jezykiem (prostszym?) ale cos sensownego trudniej napisac

0
prototype napisał(a):

Poza tym, że C++ jest trudniejszy od C jakie ma zalety w porównaniu do czystego C? Gdybym chciał napisać program typu AIMP w QT i go sprzedawać to muszę zapłacić za licencje QT5? A w GTK mogę wszystko robić za darmo? Wiem, że jeszcze jest hybryda GTK+ do pisania C z klasami i obiektowo, oraz GTKMM do pisania w C++. A wieloplatformowa biblioteka graficzna wxWidgets 3 też wymaga opłaty licencyjnej?
https://helion.pl/ksiazki/programowanie-wieloplatformowe-z-c-i-wxwidgets-3-bartosz-w-warzocha,e_17vd.htm#format/e

Tak w skrócie to: wyjątki, lambdy, szablony(i co za tym idzie cały STL czyli inteligentne wskaźniki, kontenery, algorytmy, string, wątki, system plików, etc.)

Nie musisz kupować licencji Qt

1

Dlaczego C++ wydaje się trudniejszy od C? Bo 99% kursów w internecie uczy, C++ zaczynając od C.
Jeśli pominąć bardziej zaawansowane właściwości języka C++ to C++ jest łatwiejszy od C dla początkujących, co można zobaczyć dlaczego tak jest tutaj.

3

Ogólnie C odwołuje się do problemów JAK coś zrobić. Zbudowanie w nim abstrakcji które przedstawiają strawne dla człowieka struktury algorytmów/rozwiązań/modułów/... obiektów, wymaga wysiłku w trakcie którego ginie często pierwotna idea i cel rozwiązania. Z kolei C++ odwołuje się do rozwiązań CO należy zrobić. W przypadkach gdy jest to konieczne (np. wydajność, właściwości platformy...), umożliwia odwołanie się do rozwiązań JAK. Przy dobrym podejściu, w C++ nie ginie ogólny obraz rozwiązania i o wiele bardziej zrozumiale komunikowane są intencje.
O wiele rozsądniejsze jest nauczenie się nowoczesnego C++ i dopiero później poszerzenie kompetencji o C. W przypadku możliwego wyboru, zawsze w projektach staram się preferować C++ nad C. Nawet dla systemów embedded.
Oczywiście w każdym z tych języków da się pisać czytelny i wydajny kod. W C jest to jednak trudniejsze i IMHO wymaga znajomości innych języków (choćby i C++) aby zrozumieć jakie konsekwencje ma nieczytelne tworzenie aplikacji.
Poza tym, warto w każdym roku poznawać nowy język programowania. To niesamowicie podnosi kompetencje nawet w tym w którym lubisz (lub jesteś zmuszony(a)) pracować.

3
Mokrowski napisał(a):

Ogólnie C odwołuje się do problemów JAK coś zrobić. Zbudowanie w nim abstrakcji które przedstawiają strawne dla człowieka struktury algorytmów/rozwiązań/modułów/... obiektów, wymaga wysiłku w trakcie którego ginie często pierwotna idea i cel rozwiązania. Z kolei C++ odwołuje się do rozwiązań CO należy zrobić. W przypadkach gdy jest to konieczne (np. wydajność, właściwości platformy...), umożliwia odwołanie się do rozwiązań JAK. Przy dobrym podejściu, w C++ nie ginie ogólny obraz rozwiązania i o wiele bardziej zrozumiale komunikowane są intencje.
O wiele rozsądniejsze jest nauczenie się nowoczesnego C++ i dopiero później poszerzenie kompetencji o C. W przypadku możliwego wyboru, zawsze w projektach staram się preferować C++ nad C. Nawet dla systemów embedded.
Oczywiście w każdym z tych języków da się pisać czytelny i wydajny kod. W C jest to jednak trudniejsze i IMHO wymaga znajomości innych języków (choćby i C++) aby zrozumieć jakie konsekwencje ma nieczytelne tworzenie aplikacji.
Poza tym, warto w każdym roku poznawać nowy język programowania. To niesamowicie podnosi kompetencje nawet w tym w którym lubisz (lub jesteś zmuszony(a)) pracować.

Oczywiście, że się z tobą nie zgadzam.
Po piesze jak ktoś mi pisze CO vs JAK to od razu mi się otwiera szufladka "Języki imperatywne vs języki deklaratywne", a C i C++ to są języki imperatywne, czyli takie, gdzie się opisuje jak coś zrobić.
Po drugie w C owszem trzeba dbać o więcej szczegółów i jest więcej dziergania, które w C++ dostaje się za darmo (np RAII, polimorfizm), ale to wcale nie oznacza, że w C nie da się pisać bardziej abstrakcyjnie. Oczywiście, że się da i ludzie to robią.
Jedyny problem to nauczyć się dobrego stylu programowania i go przestrzegać. Z nieznanych mi powodów panuje przekonanie, że w C trzeba pisać długie zawiłe funkcje i że tak ma wyglądać właśnie kod w C.

Podstawowa przewaga C++ nad C to, że C++ zapewnia tani niezawodny i prosty w użyciu polimorfizm, zarówno ten dynamiczny (funkcje wirtualne) jak i statyczny (szablony). W C też się da zrobić polimorfizm, ale jest trudne w napisaniu i utrzymywaniu.
Klasyczny przykład polimorfizmu w C to sterownik IO. Żeby można korzystać z takiego sterownika, musi on zapewnić 5 funkcji: open close seek read write, które mają ściśle określone prototypy.

0
MarekR22 napisał(a):

Oczywiście, że się z tobą nie zgadzam.
Po piesze jak ktoś mi pisze CO vs JAK to od razu mi się otwiera szufladka "Języki imperatywne vs języki deklaratywne", a C i C++ to są języki imperatywne, czyli takie, gdzie się opisuje jak coś zrobić.
Po drugie w C owszem trzeba dbać o więcej szczegółów i jest więcej dziergania, które w C++ dostaje się za darmo (np RAII, polimorfizm), ale to wcale nie oznacza, że w C nie da się pisać bardziej abstrakcyjnie. Oczywiście, że się da i ludzie to robią.
Jedyny problem to nauczyć się dobrego stylu programowania i go przestrzegać. Z nieznanych mi powodów panuje przekonanie, że w C trzeba pisać długie zawiłe funkcje i że tak ma wyglądać właśnie kod w C.

Podstawowa przewaga C++ nad C to, że C++ zapewnia tani niezawodny i prosty w użyciu polimorfizm, zarówno ten dynamiczny (funkcje wirtualne) jak i statyczny (szablony). W C też się da zrobić polimorfizm, ale jest trudne w napisaniu i utrzymywaniu.
Klasyczny przykład polimorfizmu w C to sterownik IO. Żeby można korzystać z takiego sterownika, musi on zapewnić 5 funkcji: open close seek read write, które mają ściśle określone prototypy.

Oczywiście zgadzam się że ze mną się nie zgadzasz ba.. nawet będę zobowiązany :) I to nawet bez skupienia się jaka szufladka Ci się otwiera. Zwróć uwagę, napisałem że w każdym języku da się pisać czytelnie a do CO/JAK użyłem "ogólnie". Bez odnoszenia się do paradygmatu proceduralny kontra deklaratywny. C ma mniej narzędzi i trudniejszych w użyciu by cel "CO" w kodzie osiągnąć a narzędzia te w większym stopniu bazują na wiedzy o platformie którą powinna posiadać osoba programująca. Wiedza ta, jak sądzę, powinna być (w wielu przypadkach) złożona na barki kompilatora i bibliotek. Czego w mojej ocenie C (vide np. obsługa stringów, automatyczne promocje do int czy float do double, ubogie i żle zaprojektowane przestrzenie nazewnicze, konieczność masowego stosowania makr w bardziej wymagających przypadkach, dalej nie rozwiązany problem precyzyjnej definicji typów atomowych) nie robi zadowalająco.
Wymaganie "to się naucz dobrze i czytelnie programować", to nie jedyny wymiar. Ważny, zgoda.. ale nie jedyny. W mojej ocenie, za daleko idące uproszczenie. Często decyduje szybsze i czytelniejsze osiągnięcie efektu przy takim samym kodzie runtime i zrozumienie intencji przez inne osoby "świeże w projekcie". A tu nowoczesne C++ oferuje już widoczne benefity tak w systemach głównego nurtu jak i embedded. Także co do "szczelniejszego" obsługiwania typów które w C trzeba uzupełniać idiomami (np. opakowanie enum strukturą by osiągnąć uszczelnienie typu i usunięcie nazwy elementu enum z przestrzeni nazewniczej, podpieranie się rozszerzeniem kompilatora by uzyskać offset do struktury mając wskaźnik na pole, itp.. ), oraz jaśniejsze i łatwiejsze przekazanie intencji ze strony programującego do kompilatora bez sztuczek void * (uproszczenie).
Dziś z perspektywy embedded w C++ polimorfizm dynamiczny, nie jest aż tak istotny (platformy classic) w porównaniu do elastycznego stosowania szablonów. Na a co do szablonów, C nie ma nic co może pomóc w generowaniu kodu (nie... makra nie....). Statyczny polimorfizm, jak najbardziej w C++ przydatny (pomijając problemy jakie generuje przy utrzymaniu stabilnego ABI)
Stąd jeśli mam wybór, wybieram C++ a nie C. Jeśli go nie mam, programuję w C stosując abstrakcje które o wiele łatwiej tak osiągnąć jak się i ich nauczyć, w innych językach.
Osobiście żałuję że najpierw uczyłem się C a nie C++. Stracił bym miej czasu gdyby kolejność była odwrotna :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1