Czy powinienem nauczyć się C przed nauką C ++? [Zamknięte]

116

Odwiedziłem dziś dzień otwarty na wydziale CS na uniwersytecie i podczas wycieczki po laboratoriach usiedliśmy, aby pobawić się kilkoma projektami z ostatniego roku przygotowanymi przez studentów. Jeden był szczególnie dobry - coś w rodzaju asteroidy FPS. Postanowiłem zajrzeć do srckatalogu, aby stwierdzić, że został wykonany w C ++ (większość pozostałych projektów to aplikacje Java 3D).

Nie robiłem wcześniej żadnego C, ale wcześniej przejrzałem kod C. Z tego, co widziałem w kodzie .cpp w tej grze, nie wyglądało to zupełnie inaczej.

Jestem zainteresowany nauką C lub C ++, ale prawdopodobnie poznam inne później. Czy jest dla mnie jakaś korzyść, jeśli uczę się jednego przed drugim, a jeśli tak, to który?

Ross
źródło
Duplikat: stackoverflow.com/questions/171126/…
David Segonds
7
To naprawdę nie jest duplikat. W domyśle to pytanie również brzmi: „czy powinienem najpierw nauczyć się programowania OOP lub programowania proceduralnego”
bobobobo
2
Przed zejściem do poniżej odpowiedzi (IMO idą w kółko), pozwala mi zaoferować kilka rad: PRAWDA : C ++ nie zachowuje wszystkie cechy i atrybuty stosowane do C, a zatem w sposób dorozumiany „ obsoleting ” C (punkt najbardziej odpowiedzi poniżej try robić). JEDNAK : C nie jest , nie , NIE MARTWY. Wydaje się, że ludzie chwytają się zasady „ nie ma potrzeby uczyć się obu ” na drogie życie, ale w rzeczywistości nie ma to podstaw. Aby pożyczyć składni pochodzącej z C, C ++! = C . Znajomość C ++ NIE uczyni cię wykwalifikowanym programistą C, podobnie znajomość C NIE uczyni cię kwalifikowanym programistą C ++.
Super Cat
4
TO POWIEDZIAŁO : Nie ma nic złego w nauce C przed zagłębieniem się w C ++ - Im więcej wiesz, tym lepiej - Ale wręcz przeciwnie, nie musisz uczyć się C, jeśli Twoim ostatecznym celem jest nauczenie się C ++ . Jeśli chcesz dowiedzieć się C ++, przejdź dowiedzieć się C ++ , a jeśli chcesz dowiedzieć t C, przejdź nauczyć C . Oba mają wady i zalety (prostota C i -duża głębia- cechy C ++ są zarówno przekleństwami, jak i błogosławieństwami na swój sposób) i oba są nadal używane (C dla systemów wbudowanych, Unity, PHP itp. - C ++ także dla Unity, Unreal itp.).
Super Cat
3
PUNKT: Chcesz nauczyć się C ++? Następnie pomiń C. Nie potrzebujesz tego. Chcesz się nauczyć C? Więc dobrze, idź się nauczyć C. Jeśli chcesz nauczyć się obu, najpierw wybierz C. Oboje mają swoje miejsce na świecie, więc nie myśl, że jedno jest wystarczające dla drugiego.
Super Cat

Odpowiedzi:

121

Nie ma potrzeby uczyć się C przed nauką C ++.

To są różne języki . Powszechnym błędem jest przekonanie, że C ++ jest w pewnym sensie zależny od C, a nie jest samodzielnym w pełni określonym językiem.

Tylko dlatego, że C ++ ma dużo tej samej składni i wiele tej samej semantyki, nie oznacza, że ​​musisz najpierw nauczyć się C.

Jeśli nauczysz się C ++, w końcu nauczysz się większości języka C z pewnymi różnicami między językami, których będziesz się uczyć z czasem. W rzeczywistości bardzo trudno jest napisać poprawny C ++, ponieważ średniozaawansowani programiści C ++ mają tendencję do pisania w C / C ++. Jest to prawdą niezależnie od tego, czy zaczynałeś w C, czy nie w C ++.

Jeśli znasz C jako pierwszy, to jest to dobry plus do nauki C ++. Zaczniesz od znajomości języka. Jeśli najpierw nie znasz języka C, nie ma sensu skupiać się na innym języku. Dostępnych jest wiele dobrych książek i samouczków, które rozpoczynają się od niczego nie wiedzącego i obejmują wszystko, czego nauczyłbyś się z C, co dotyczy również C ++.

Proszę zobaczyć dalsze uzasadnienie w tej odpowiedzi .

Brian R. Bondy
źródło
33
Nie mogłem się więcej nie zgodzić. Nauka języka C ++ w pierwszej kolejności sprawia, że ​​„powrót” do języka C jest bardzo trudny. C jest podstawowym językiem systemowym, który opiera się tylko na podstawach. C ++ to zupełnie nowa gra, podejście do każdego problemu w obu językach będzie się znacznie różnić. Miałem szczęście majstrować przy C, zanim wskoczyłem do pracy w C ++. Następnie jestem w stanie mentalnie „wygotować” cukier syntaktyczny, który dostarcza C ++, i potrafię rozwiązywać problemy z każdym językiem. Bardzo łatwo jest mi zidentyfikować C jako część „robi rzeczy” w parze językowej. Nauka języka C ++ jako pierwsza doprowadzi do zdezorientowanych i wprowadzonych w błąd programistów.
Matt Joiner
24
@Matt: Najpierw nauczyłem się C ++ i nie jestem wprowadzonym w błąd programistą. Więc twoje twierdzenie nie jest prawdziwe, dowód na kontrprzykład. I tak, mam też złotą odznakę w języku C. Prawda jest taka, że ​​są to dwa różne i różne języki. Nie potrzebujesz jednego języka jako zależności, aby nauczyć się drugiego. To tylko głupie nieporozumienie.
Brian R. Bondy
8
@Matt: Również z mojego postu z linkiem: Powinieneś najpierw nauczyć się C ++, nie dlatego, że nauka C najpierw cię zrani, nie dlatego, że będziesz musiał się czegoś oduczyć (nie będziesz), ale dlatego, że nauka C nie przyniesie korzyści. W końcu i tak nauczysz się wszystkiego o C, ponieważ jest on mniej więcej zawarty w C ++.
Brian R. Bondy
11
@Matt: Przepraszam, że nadal nie rozumiesz. Narysuj diagram Venna C i C ++ i spójrz na części, które się przecinają. C ++ składa się z całego koła C ++, które narysujesz, a nie tylko z części, które się nie przecinają. Jeśli najpierw znasz C, dobrze dla Ciebie, możesz nauczyć się C ++ szybciej. Jeśli nie znasz języka C jako pierwszy, nie ma powodu, aby uczyć się go najpierw. Czy zakładasz, że każda książka o C ++ nie będzie obejmować wskaźników i zarządzania pamięcią, literałów ciągów itp.? Przestanę teraz rozmawiać, ale nie krępuj się zostawić uwag końcowych.
Brian R. Bondy
11
@Matt: w jaki sposób C prowadzi do lepszego zrozumienia C ++? Zazwyczaj programiści C, którzy uczą się C ++, piszą brzydki, podatny na błędy kod w stylu „C z klasami”. Nie mówię, że tak się dzieje zawsze , ale jest to najbardziej naturalny postęp, kiedy zaczynamy od C, ponieważ C jest znacznie bliższe temu okropnemu stylowi C ++ niż „nowoczesnemu” C ++.
jalf
77

Uwielbiam to pytanie - to tak, jakby pytać „czego powinienem się najpierw nauczyć, jeździć na snowboardzie czy nartach”? Myślę, że zależy to od tego, czy chcesz jeździć na snowboardzie, czy na nartach. Jeśli chcesz robić jedno i drugie, musisz się nauczyć obu.

W obu sportach zjeżdżasz ze wzgórza po śniegu za pomocą urządzeń na tyle podobnych, aby sprowokować to pytanie. Jednak są one również na tyle różne, że poznanie jednego nie pomoże ci zbytnio z drugim. To samo z C i C ++. Chociaż wydają się być językami wystarczająco podobnymi pod względem składni, sposób myślenia, którego potrzebujesz do pisania kodu OO w porównaniu z kodem proceduralnym, jest na tyle inny, że prawie musisz zacząć od początku, niezależnie od języka, którego się uczysz jako drugi.

cdonner
źródło
70

Najpierw nauczyłem się C, a zanim nauczyłem się C ++, wziąłem udział w kursie struktur danych, w których był używany. To zadziałało dla mnie dobrze. Kurs struktur danych w C dał mi solidne zrozumienie wskaźników i zarządzania pamięcią. Ujawniło również korzyści płynące z paradygmatu zorientowanego obiektowo, kiedy już się dowiedziałem, co to jest.

Z drugiej strony, ucząc się najpierw C, rozwinąłem pewne nawyki, które początkowo powodowały, że pisałem zły kod w C ++, takich jak nadmierne używanie wskaźników (gdy wystarczą odwołania w C ++) i preprocesora.

C ++ jest naprawdę bardzo złożonym językiem z wieloma funkcjami. Tak naprawdę nie jest to jednak nadzbiór C. Jest raczej podzbiór C ++ składający się z podstawowych konstrukcji programowania proceduralnego (pętle, if i funkcje), który jest bardzo podobny do C. W twoim przypadku zacznę od tego, a następnie przejdę do bardziej zaawansowanych koncepcji jak klasy i szablony.

Najważniejszą rzeczą, IMHO, jest wystawienie się na różne paradygmaty programowania, takie jak procedury, zorientowanie obiektowe, funkcjonalne i logiczne, na wczesnym etapie, zanim twój mózg zamarznie w jeden sposób patrzenia na świat. Nawiasem mówiąc, gorąco polecam również naukę funkcjonalnego języka programowania, takiego jak Scheme. To naprawdę poszerzyłoby twoje horyzonty.

Dima
źródło
18

Jeśli zdecydujesz się uczyć obu (i jak wspominały inne osoby, nie ma wyraźnej potrzeby, aby uczyć się obu), najpierw naucz się C. Przejście z C do C ++ wydaje się naturalnym postępem; pójście w drugą stronę jest jak celowe zawiązanie jednej ręki za plecami. :-)

Head Geek
źródło
13

Myślę, że powinieneś najpierw nauczyć się C, ponieważ ja nauczyłem się C. C dał mi dobre pojęcie o składni i problemach z takimi rzeczami, jak wskaźniki, z których wszystkie przechodzą do C ++.

Myślę, że C ++ ułatwia podsumowanie wszystkich tych problemów (potrzebujesz tablicy, która nie przepełni się, gdy użyjesz operatora [] i podejrzanego indeksu? Jasne, utwórz klasę tablicy, która sprawdza granice), ale musisz wiedzieć, co są i dają się przez nie ugryźć, zanim zrozumiesz, dlaczego coś się dzieje w określony sposób.

Kiedy wszystko jest już powiedziane i zrobione, sposób, w jaki C ++ jest zwykle nauczany, to „C ++ to C z obiektami, tutaj jest C, a oto jak działają wszystkie te OO”, więc prawdopodobnie nauczysz się podstawowego C przed jakimkolwiek prawdziwym C ++, jeśli i tak śledź większość tekstów.

Adam Hawes
źródło
Nie zgadzam się. Każda książka o programowaniu C ++ warta swojej soli obejmie przynajmniej niektóre z "pułapek", takich jak sposób działania tablic (i jak zapobiegać przepełnieniu)
moonman239
12

Nie zgadzam się z większością tutaj. Myślę, że powinieneś nauczyć się C przed nauką C ++. Na pewno nie jest to konieczne, ale myślę, że znacznie ułatwia naukę C ++. C jest sercem C ++. Wszystko, czego dowiesz się o C, ma zastosowanie do C ++, ale C jest dużo mniejsze i łatwiejsze do nauczenia.

Podnieś K&R i przeczytaj to. Jest krótki i daje wystarczające wyczucie języka. Kiedy już opanujesz podstawy wskaźników i wywołań funkcji, możesz trochę łatwiej przejść do C ++.

Steve Rowe
źródło
15
Źle. Prawie wszystko, czego uczy C, jest złą praktyką w C ++. C nie jest sercem C ++, po prostu ma wiele wspólnego ze składnią. Proszę, świat ma już wystarczająco dużo programistów "C z klasami". Naucz się C lub C ++. Ale nie udawaj, że C to lite C ++.
jalf
13
Trzymam się swoich słów. C ++ jest zbudowany na bazie C i dlatego C jest jego sercem. Idiomy używane w C ++ różnią się znacznie od idiomów używanych w C, ale składnia jest taka sama. Można nauczyć się prawidłowego programowania w C ++ zaczynając od C. Spójrz na C ++ Primer. W zasadzie to robi.
Steve Rowe
6
+1. C to mniejszy język, dzięki czemu łatwiej się go nauczyć. Próba uzyskania kompatybilności wstecznej z C jest jednym ze źródeł głównych problemów z C ++, innym jest system szablonów, który jest zbyt skomplikowany dla 90% programistów C ++.
hillu
1
Zrozumienie zmiennych, typów [w tym wskaźników i kwalifikacji], zakresu, funkcji, preprocesora i powiązań jest niezbędne zarówno dla C, jak i C ++. Powiedziałbym, że uczenie się tych pojęć z C będzie łatwiejsze, dzięki czemu nie trzeba też zająć się wiedząc klas, innym rozumieniu static, szablony (i śmiesznie zastraszające błędów szablonów kompilatory emitują) itd.
dreamlax
1
Masz rację. Właściwie może być dobra nauka C, aby móc przejść do C ++ z lepszą znajomością jego korzeni.
Daniel Daranas
10

Podczas nauki języka C ++ nauczysz się również większości języka C. Ale pamiętaj, że dużo kodu w C ++ jest nieprawidłowych C. C ++ został zaprojektowany tak, aby był zgodny z kodem w C, więc powiedziałbym, że najpierw naucz się C ++. Brian napisał świetną odpowiedź dotyczącą tego.

John T.
źródło
8

Podobnie jak odpowiedzi na wiele innych życiowych pytań, to zależy. To zależy od Twoich zainteresowań i celów programistycznych. Jeśli chcesz programować aplikacje desktopowe, być może za pomocą GUI, C ++ (i OOP) jest prawdopodobnie lepszym rozwiązaniem. Jeśli interesuje Cię programowanie sprzętu na czymś innym niż chipset x86, C jest często lepszym wyborem, zwykle ze względu na jego szybkość. Jeśli chcesz stworzyć nowy odtwarzacz multimedialny lub napisać aplikację biznesową, wybrałbym C ++. Jeśli chcesz przeprowadzić naukowe symulacje zderzeń galaktyk lub dynamiki płynów, spójrz na moc C.

Scottie T
źródło
4
W wielu scenariuszach obliczeniowych o wysokiej wydajności te kilkaset cykli zegara rzeczywiście ma znaczenie.
Scottie T
1
@ScottieT: Biorąc pod uwagę, że poza restrictspecyfikatorem C nie ma innej konstrukcji składniowej / semantycznej związanej z wydajnością niż C ++, dlaczego właściwie myślisz, że kod C ++, z jego bogatszą składnią i np. Metaprogramowaniem, powinien dawać wolniejszy kod? Czy znasz w ogóle szablony wyrażeń?
Sebastian Mach,
1
@phresnel: Trafność. C ++ to niezwykle złożony język z funkcjami, które często nie są warte kupowania. Zasadniczo C daje takie same możliwości wydajnościowe jak C ++ przy znacznie mniejszym koszcie złożoności.
Matt Joiner,
1
@MattJoiner: Konserwowalność / rozszerzalność to także czynniki wydajnościowe, chociaż zdaję sobie sprawę, że kod naukowy jest często jednorazowy. Jednak powtarzając argument szablonów wyrażeń (jako przykład), mówię, że C ++ ma więcej możliwości optymalizacji (również dlatego, że łatwiej jest napisać kod szablonu wyrażenia niż kod wewnętrzny), z jednym wyjątkiem ( restrictktóry jednak wszystkie główne kompilatory C ++ udostępniają jako rozszerzenie). I czy naprawdę myślisz, że biorąc pod uwagę ten sam kod, będzie jakaś różnica w wydajności między C ++ i C przy tym samym kompilatorze? [...]
Sebastian Mach
1
@MattJoiner: [...], a czytając stwierdzenia typu „tak bardzo, jak nie lubię C ++” pozwala mi zbudować założenie, że jesteś lekko stronniczy w tej dyskusji. Jak myślisz, co dokładnie sprawia, że ​​kod C ++ działa gorzej? Jeśli C ma te same możliwości wydajnościowe, jaki jest odpowiednik szablonów wyrażeń, ogólnie szablonów, obliczeń w czasie kompilacji na nie-wewnętrznych typach danych, funktorach? I dodanie współczynnika kosztu / utrzymania: RAII, przeciążenie operatora / funkcji, ogólne standardowe kontenery, standardowe wątki, ogólne standardowe algorytmy, odwołania?
Sebastian Mach,
8

Nauka języka C zmusza Cię do dokładniejszego przemyślenia niektórych kwestii, takich jak jawne i niejawne zarządzanie pamięcią lub rozmiary magazynów podstawowych typów danych w czasie pisania kodu.

Gdy osiągniesz punkt, w którym będziesz czuć się komfortowo z funkcjami i nieprawidłowościami C , prawdopodobnie będziesz miał mniej problemów z nauką i pisaniem w C ++.

Jest całkowicie możliwe, że kod C ++, który widziałeś, nie różnił się zbytnio od standardowego C, ale może tak być, ponieważ nie był zorientowany obiektowo i nie używał wyjątków, orientacji obiektowej, szablonów ani innych zaawansowanych funkcji.

hillu
źródło
8

Myślę, że nauczenie się C najpierw to dobry pomysł.

Jest powód, dla którego kursy informatyczne nadal używają C.

Moim zdaniem jest to dla uniknięcia całego „tłoczenia się” przedmiotu obowiązku wymagającego prowadzenia OOP.

Myślę, że programowanie proceduralne to najbardziej naturalny sposób na naukę programowania. Myślę, że to prawda, ponieważ pod koniec dnia masz to, co masz: wiersze kodu wykonujące się jedna po drugiej.

Wiele dzisiejszych tekstów naciska na podejście „najpierw przedmioty” i zaczyna mówić o samochodach i zmianach biegów, zanim wprowadzą tablice.

bobobobo
źródło
4
Wygląda na to, że obecnie wiele kursów komputerowych wykorzystuje Javę, co zaostrza problem, o którym mówisz.
Dima,
2
Masz bardzo dobry punkt widzenia. Oprócz tego, że jest zbyt skomplikowany dla pierwszego języka, C ++ w większości zachęca do ukrywania interakcji niskiego poziomu z systemem operacyjnym i pamięcią, które są krytyczne dla dobrego nauczania informatyki. Tablice powinny być nauczane na długo przed obiektami.
Matt Joiner
1
Z drugiej strony, jeśli nie jesteś zły z matematyki, programowanie funkcjonalne może być bardziej naturalne, ponieważ wygląda i działa bardziej znajomo.
Sebastian Mach
2
„Jest powód, dla którego kursy informatyczne nadal używają języka C.” Tak, ponieważ większość kursów informatycznych jest słabo nauczana.
Wyścigi lekkości na orbicie
8

Nie.

Ogólnie bardziej przydatna jest nauka C ++, ponieważ jest bliższa najnowocześniejszym językom opartym na obiektach obiektowych, takich jak Eiffel lub C #.

Jeśli Twoim celem jest nauka C ++, najpierw naucz się nowoczesnego, standardowego C ++. Odłóż mallocs na bok.


Ale Steve Rowe ma rację ...

Daniel Daranas
źródło
Obecnie C ++ nie jest bliżej języków OO, takich jak C # czy Eifel.
einpoklum
7

Obserwując ludzi, którzy jako pierwsi nauczyli się Javy, zmagają się z koncepcjami wskaźników i zarządzania pamięcią w C ++, powiedziałbym, że nauka C jako pierwsza jest dobrym pomysłem, aby uchwycić te dwie koncepcje, odizolowane od złożoności innych C ++. cechy.

TrayMan
źródło
6

Moje dwa centy:

Proponuję najpierw nauczyć się C, ponieważ:

  • jest to język podstawowy - wiele języków pochodzi od C
  • więcej platform obsługuje kompilator C niż C ++ - czy to systemy wbudowane, układy GPU itp.
  • według TIOBE indeks C jest nadal około 2 razy bardziej popularny niż C ++.
Agnius Vasiliauskas
źródło
3

Myślę, że c to naprawdę fajny język programowania, jest zwarty i dość łatwy do nauczenia. ale jeśli chcesz się tylko nauczyć C ++, zacznij od C ++. ale proponuję nauczyć się obu. i jeśli chcesz to zrobić; myślę, że lepiej zacząć od c. jak powiedziałem wcześniej: jest mały i dość łatwy do nauczenia. może być fajnym krokiem naprzód w kierunku bardziej złożonego języka programowania, jakim jest c ++. (ponieważ c zapewnia kilka podstaw)

powodzenia.

Marnix przeciwko R.
źródło