Czy to w porządku, jeśli nie znam C, ale jestem dobry w C ++? [Zamknięte]

23

Mam pytanie, na które, jak sądzę, najlepiej odpowiedzieć tutaj.

Jestem całkiem niezły C++, dobrze, bo dobrze się z językiem, przeczytałem Accelerated C++i wykonałem prawie wszystkie ćwiczenia.

Mam jednak duży problem. Czy muszę się uczyć C? Nigdy Cw życiu tego nie robiłem . Zacząłem od C++kiedy zacząłem programować. Prawdopodobnie dlatego, że zawsze byłem zainteresowany tym, dlaczego wszyscy nazywają ten język tak złożonym. Teraz jednak znam odpowiedź na to pytanie;)

Szczególnie interesuje mnie to, czy mogę przetrwać bez wiedzy Cw dzisiejszym świecie. Na przykład, jeśli udzielę wywiadu w firmie, jeśli powiem, że nie wiem C- czy uznają to za OK? Dwa języki, w których jestem dobry, to Python i C ++. Pytam o to, ponieważ słyszałem, że firmy pytają o struktury danych w wywiadach. Jeśli więc poproszą mnie o wdrożenie, a jeśli zrobię to w C ++, czy jest to do przyjęcia?

A ludzie, którzy mówią „jak możesz nie znać C, gdy C ++”, proszę nie odpowiadać :) Bez urazy, ale nie rozumiem, dlaczego nauka C jest niezbędna.

SS
źródło
1
Artykuł cytowany przez DumbCodera dotyczy popularności C w programowaniu wbudowanym.
ChrisW
2
@ChrisW - Tak, ale wciąż pokazuje, że C nie jest tak łatwe do opanowania, nie że C ++ jest łatwe do opanowania.
DumbCoder
@DumbCoder: O nie, wbudowane programowanie. Ile zadań jest osadzonych w porównaniu do komputerów stacjonarnych?
DeadMG
@DeadMG - Opanowanie języka nie ma nic wspólnego z liczbą dostępnych miejsc pracy dla tego języka. A skąd pomysł, że C jest używany tylko w programowaniu wbudowanym?
DumbCoder

Odpowiedzi:

36

Jeśli znasz C ++, nie uczyłbym się C tylko ze względu na to. Nie powinieneś mieć trudności z nauczeniem się, czy i kiedy tego potrzebujesz.

Zdecydowanie wolałbym spotkać kogoś, kto twierdzi, że zna C ++, ale nie C, niż kogoś, kto twierdzi, że zna C / C ++.

CB Bailey
źródło
O tak. Jest to lista przedmiotów pierwsza w pytaniu SO na temat mitów miejskich C ++: stackoverflow.com/questions/2245196/c-urban-myths
4
+1. Jeśli znasz C ++, to na początek trzeba się uczyć, a po drugie, to naprawdę nieważne.
DeadMG
6
@DeadMG Nauka składni może być łatwa, ponieważ jest to tylko wiedza o tym, które części C ++ należy pominąć, ale nauka wspólnych idiomów jest trudniejsza i prawdopodobnie najważniejsza. Ale nie nauczyłbym się C, jeśli nie jest potrzebny.
KeithB
6
@ chubsdad masz na myśli, że nie powinienem umieszczać „Wiem Java / JavaScript” w moim CV?
Incognito
@ user257493: Nie ma czegoś takiego jak Java / JavaScript
John Dibling
23

Odpowiedź wieloczęściowa. Tylko moje opinie.

  1. Moje doświadczenie (25 lat po studiach) jest takie, że C ++, choć coraz rzadziej, nadal będzie miał kluczowe znaczenie dla interesujących systemów w dającej się przewidzieć przyszłości. Trzymam się tego jako mojej głównej specjalizacji. Praca jest ciężka, interesująca i ważna.

  2. Programiści C ++ są ogólnie cenni właśnie dlatego, że nie dorastali w językach zarządzanych, a zatem mają większe prawdopodobieństwo zrozumienia tego, co dzieje się pod przykryciem. Łatwiej jest przejść z C ++ do C # / Java niż odwrotnie, ponieważ pasek wprowadzania jest wyższy.

  3. Tak więc, moim zdaniem, nie jest konieczne rozumienie C, aby móc kompetentnie programować w C ++, rozwijanie zrozumienia, dlaczego C ++ istnieje w kontekście C - jego ograniczenia i mocne strony oraz sposób, w jaki są one rozwiązywane, czy nie w C ++ - byłoby bezcenne dla ciebie z czasem.

Powodzenia.

Steve Townsend
źródło
Co sprawia, że ​​mówisz, że C ++ jest coraz rzadszy? Z twojego doświadczenia, co to wypiera?
Praxeolitic
13

Oto, co ma do powiedzenia Bjarne:

Znajomość języka C jest warunkiem koniecznym do nauki języka C ++, prawda?

Źle. Wspólny podzbiór C i C ++ jest łatwiejszy do nauczenia niż C. Będzie mniej błędów typowych do ręcznego wychwytywania (system typów C ++ jest bardziej rygorystyczny i bardziej ekspresyjny), mniej sztuczek do nauczenia się (C ++ pozwala wyrazić więcej rzeczy bez omijania) i dostępne lepsze biblioteki. Najlepszym początkowym podzbiorem C ++ do nauczenia się nie jest „całe C”.

Chubsdad
źródło
4

Tylko moja osobista opinia: jeśli znasz C ++, możesz pisać w C. Niektóre doświadczenia byłyby fajne, ale to nie jest problem. Przeciwnie, nie jest poprawna: znajomość języka C nie pozwala na pisanie w języku C ++, bez dodatkowej nauki. Nigdy nie nauczyłem się C i używam go, gdy jest to konieczne, bez żadnych problemów.

Alex F.
źródło
3
@Alex Farber - „Jeśli znasz C ++, możesz pisać w C”. Bardzo w to wątpię :)
DumbCoder
4
Nie zgadzać się. IME, programiści, którzy uczą się C ++, najpierw nie zdają sobie sprawy, jakie funkcje C ++ nie mają. Programiści, którzy najpierw uczą się języka C, mogą łatwo pisać w C ++, ale zaczynają nieidiomatycznie.
dan04,
1
Opiera się to na moim osobistym doświadczeniu. Nauczyłem się C ++ i większość swojej pracy w C ++. Ale używam C, gdy jest to konieczne, bez żadnych problemów.
Zwłaszcza, że ​​wszystkie urocze biblioteki klas nie są dostępne w C. Imo zwycięstwem języków takich jak C ++ i Java są biblioteki, a nie same w sobie cechy językowe.
8
Programiści C ++ próbujący włamać się przez C piszą zły kod z tych samych powodów, dla których programiści C ++ próbują włamać się przez C ++, pisząc zły kod. Faceci C używają C ++ jako „C z klasami”, podczas gdy faceci C ++ używają C jako „C ++ bez klas”.
John Dibling
4

Dobra, po pierwsze - nie, znajomość C nie jest warunkiem do nauki C ++. Rzeczywiście może to stanowić przeszkodę.

Po drugie, jest to całkowicie sytuacyjne. To, czy będziesz musiał znać C, zależy całkowicie od tego, czy praca tego wymaga. Jeśli chcesz być facetem od systemów wbudowanych, to tak, nauka języka C pomoże. W przeciwnym razie większość zadań nie będzie tego wymagać. Jeśli praca potrzebuje C, powinna to powiedzieć. Jeśli tak nie jest, prawdopodobnie nie potrzebuje tego. Jeśli chodzi o struktury danych, znów sprowadza się to do firmy. Zwykle firma mówi: „Programujemy w tych językach, napisz do nas tę strukturę danych. Użyj wybranego przez siebie języka z powyższej listy”. Jeśli poprosą cię o napisanie go w C, po prostu powiesz: „Nie znam C - w moim CV nie napisano, że znam C, ta praca nie jest dla mnie”.

Stephen
źródło
Dlaczego znajomość C miałaby utrudniać naukę C ++? Nie twierdzę, że niekoniecznie się zgadzam, ale jest to odważne stwierdzenie.
Casey Patton
3

Na przykład, jeśli udzielę wywiadu w firmie, jeśli powiem, że nie znam C - czy uznają to za OK?

Zapytaj, czy potrzebują C (i bądź gotów się tego nauczyć, czy nie, jeśli tak).

Jeśli więc poproszą mnie o wdrożenie, a jeśli zrobię to w C ++, czy jest to do przyjęcia?

Spodziewałbym się tego, jeśli przeprowadzają wywiady / zatrudniają cię do pracy w C ++.

Jeśli jest to pytanie o „struktury danych”, możesz zapytać ich, czy chcą, abyś zademonstrował użycie kontenerów STL, czy też (ponieważ jest to wywiad) chcą, abyś zaimplementował struktury danych od podstaw.

ChrisW
źródło
2

C jest prawie właściwym podzbiorem C ++. Jeśli nie znasz C, to nie znasz dużego i ważnego podzbioru C ++. Czy mają nauczyć się tego podzbioru? Nie. C ++ jest absurdalnie dużym językiem i większość ludzi wybiera z nim podzbiór i program. Nie jest wymagane, aby znać podzbiór, którym jest C. W szczególności nie jest tak ważne, aby znać standardową bibliotekę C. Rzuciłbym jednak bardzo podejrzane oko na każdego, kto nie rozumiał podstawowych pojęć C, takich jak wskaźniki, tablice i drżenie.

frankc
źródło
2

Czy muszę się uczyć języka C?

Nie, nie musisz. Kropka.

Ale nauka nowego języka programowania jest korzystna na dłuższą metę. Nauka języków w oparciu o różne paradygmaty programowania jest jeszcze bardziej korzystna. Niezależnie od tego, czy jest to język OOP (Smalltalk lub C ++), język dynamiczny (Lisp, Clojure, Python), funkcjonalny (Lisp, Haskell, Erlang), współbieżny (Erlang, Go, Algol 68, Smalltalk), czy cokolwiek innego (Fortran 03, Perl, Forth) inny wymyślony paradygmat uderza w twoją fantazję; nauka różnych języków pomaga poznać wiele linii myślenia, z których każda ma swoje mocne i słabe strony, aby poradzić sobie z danym zadaniem.

Fortran nadal dominuje w obliczeniach numerycznych, COBOL jest nadal podstawą dużych firm ubezpieczeniowych, Unix, BSD i Linux są nadal oparte głównie na C. Stary kod nie zawsze traci na wartości wraz z wiekiem, ponieważ niekoniecznie się zużywa jak urządzenia mechaniczne, które z czasem trzeba wymienić. Tak więc starszy język może być cenny pod względem szans na zatrudnienie w porównaniu z fajnym czynnikiem nowego języka .

Podobnie jak nauka bycia wielojęzycznym w naturalnych (ludzkich) językach prawdopodobnie poprawia twoją zdolność do wyrażania siebie , tak samo niesie ze sobą ten sam bonus dla języków komputerowych.

Chociaż uważam, że ważne jest (z biegiem czasu), aby nauczyć się biegłej znajomości nie tylko wielu języków, ale ważniejsza jest biegła znajomość wielu paradygmatów programowania.

Jestem całkiem dobry z C ++, dobrze, ponieważ dobrze się z tym językiem, przeczytałem Accelerated C ++ i wykonałem prawie wszystkie ćwiczenia

Mam zamiar wykonać kopię zapasową i powiedzieć, że C ++ jest bogatym i złożonym językiem, potrzeba lat lat ekspozycji i ciągłej praktyki, aby stać się naprawdę płynnym we wszystkich jego bogatych (lub brzydkich) subtelnościach.

Nie spiesz się, a nauka jest najważniejszą radą, jaką mogę ci dać. Jeśli ktoś podejmie się tego, zachęcam do zapoznania się z treścią „ Naucz się programowania przez Petera Norviga za dziesięć lat” .

rev mctylr
źródło
1

Bardzo krótka odpowiedź na twoje pytanie: zależy w dużej mierze od twoich potrzeb. Niektóre firmy polegają głównie na C, czasem jako relikwie (jeśli C był już używany od lat). Inne firmy nie mają nic wspólnego z C. C jest językiem niższego poziomu niż, powiedzmy, Python lub Java, a wiele programów użytkowych może nie wymagać żadnej znajomości C. W przeciwieństwie do języków OOP, C wymaga innego myślenia, dzięki któremu Mam na myśli to, że programy są zorganizowane i zorganizowane w różny sposób i należy wziąć pod uwagę niektóre bardziej szczegółowe aspekty. Na ogół warto nauczyć się tego idiomu, a nawet po prostu poszerzyć swój umysł, że tak powiem. Ale znowu to, czy firmy będą dbać, zależy od ich potrzeb. Niektóre mogą dać ci wybór języka, niektóre mogą wymagać Java, inne C ++, inne wciąż C itp. Czy potrafisz przetrwać? Tak dzisiaj' Świat ma tak wiele różnych obszarów programowania, że ​​nigdy nie możesz przejść obok kodu C. Powinieneś nauczyć się C? Powiedziałbym - tak, niezależnie od późniejszego użycia.

użytkownik400348
źródło
1

Niektórzy ludzie mogą nie czuć się komfortowo programując w C, znając C ++.

Wokół C ++ istnieje „ochronna” struktura, która przyczynia się do sterowania nie tylko strukturą, ale także algorytmami programu. Na przykład pomoc w strukturze STL i algorytmach, oczywiste podejście do programowania obiektowego, con / destructor, dodana warstwa abstrakcyjna pochodząca z szablonów ...

Podczas gdy C jest - powiedział - prostszy, zmusza programistę do samodzielnego wstrzykiwania struktury i algorytmów do modelowania problemu. To intensywny wzrost swobody programowania.
Ale ma to swój koszt, ponieważ niektórzy ludzie potrzebują bardziej narzuconej struktury i zbudować program, który staje się wykładniczo trudniejszy w utrzymaniu, gdy staje się większy. Często mówię, że problemem nie jest język (C), ale to, co się z nim robi.

Biorąc to pod uwagę, jako osoba rekrutująca cieszę się, że mogę przeprowadzić wywiad z kimś, kto ma silne umiejętności C ++, ale byłbym jeszcze bardziej entuzjastyczny, gdyby miała wystarczającą autonomię językową, aby opracować cały projekt C.

Dobry program C wymaga również dobrych umiejętności programistycznych, ponieważ język wymaga (zwykle) dobrego zrozumienia składników systemu, aby zbudować wydajne środowisko uruchomieniowe.

Pierścień Ø
źródło
Nie powiedziałbym, że zwiększa swobodę programisty - zawsze możesz pisać własną strukturę i algorytmy w C ++.
DeadMG,
0

Jeśli czujesz się komfortowo w C ++, nie martwię się o naukę C. C ++ ma wiele ulepszeń w stosunku do C (zdolność do obsługi RAII za pomocą konstruktorów / destruktorów, podstawowych kontenerów, strumieni i łańcuchów jest duża).

Sugerowałbym jednak nauczenie się printfi scanfszeregu funkcji, abyś mógł CZYTAĆ kod, który ich używa. Są dość popularne w C ++, więc wiedza o ich użyciu jest pomocna. Nie sugeruję używania ich we własnym kodzie bez konkretnego powodu.

Mark B
źródło
0

Jedynym razem, kiedy trzeba wiedzieć C jest jeśli przewiduje się kod C. Jeśli nie, to nie ma problemu.

Nie pisałem C profesjonalnie przez ostatnie 6 lat; istnieje wiele domen aplikacji lepiej obsługiwanych przez inne języki (przynajmniej z punktu widzenia wydajności, jeśli nie wydajności), takie jak Java, C # lub Python. Z pewnością możesz przetrwać, a nawet prosperować jako programista bez dotykania C.

Jeśli chcesz nauczyć się C dla własnego znęcania się, nie ma sprawy. W zależności od tego, jak nauczyłeś się C ++ i od tego, jak polegasz na funkcjach specyficznych dla C ++ (szablony, typy referencyjne, STL, przeciążanie) możesz nieco popsuć się, gdy zdasz sobie sprawę, że 90% narzędzi, dzięki którym programowanie jest tolerowane, nie jest już dostępnych. Rzeczy takie jak zarządzanie pamięcią w C jest bardzo pracochłonne i żmudne w porównaniu do C ++ lub Java. Istnieją również pewne niezgodności między C i C ++, a wraz z każdą nową wersją językową ta luka będzie się powiększać.

Nadal istnieją domeny aplikacji, w których C jest właściwym narzędziem do pracy: mała, szybka, mało magii pod maską, a nie montaż. Jednak w przypadku ogólnego tworzenia aplikacji (zwłaszcza aplikacji komputerowych opartych na graficznym interfejsie użytkownika) dostępne są znacznie lepsze narzędzia.

John Bode
źródło
-1

Myślę, że jeśli czujesz się dobrze w C ++, to też będziesz w C.

Główną różnicą między nimi jest to, że C ++ jest czysty - obiektowy - C nie jest :)

Nuno
źródło
1
Jestem wielkim fanem C ++, ale nie nazwałbym tego czystym. A C ++ jest paradygmatem, co oznacza, że ​​dobry kod C ++ niekoniecznie jest zorientowany obiektowo.
KeithB
-1

Znajomość C daje ci wgląd w zarządzanie pamięcią itp. Chodzi o to, jak niski poziom chcesz uzyskać i czy zrozumienie rzeczy przy niższej dźwigni pomaga ci, czy nie. Możesz pójść o krok dalej i nauczyć się również języka asemblera, ale wszystko zależy od tego, ile jest dla ciebie warte.

Zależy to również od tego, czy chcesz programować w C, czy nie. :)

Alexander Liberson
źródło
-1

Tak jest ok...

IMHO, skoro jesteś dobry C++, naprawdę wystarczy ...

Założę się, że istnieją branże, które szukają programistów C ++ ... Ale kiedy już się w to zaangażujesz, wszystko zależy od potrzeb twojego projektu. Cokolwiek to wymaga, musisz się nauczyć. Może to być Java, .Net lub nawet C .. Jeśli firma jest gotowa Ci zapłacić, po prostu naucz się ...

Jeśli jesteś na wcześniejszych etapach swojej kariery, ankieterzy IME mają tendencję do patrzenia na twoje nastawienie i zrozumienie języka, w którym czujesz się komfortowo.

Zamiast uczyć się Cdla samej nauki, naucz się nieco C ++ .. Popraw to, w czym jesteś dobry. Jestem pewien, że możesz się wiele nauczyć ... Dla mnie zawsze jest coś do nauki w C ++ ..: )

LIAK
źródło
-1

Myślę, że najważniejsze rzeczy, które powinieneś wiedzieć o C, to różnice między C i C ++. Będzie prawdopodobnie zobaczyć jakiś kod, który ma pewne C styl w nim w pewnym momencie, i nie powinno być mylone gdy widzisz rzeczy jak malloc, free, printf, fopen, lub fclose. Powinieneś także wiedzieć, jak są one podobne, a także czym różnią się od ich odpowiedników w C ++.

Powinieneś także o tym wiedzieć <<i >>są operatorami lewej i prawej zmiany, a nie operatorami wstawiania. W C ++, gdzie można przeciążać operatorów, zostały one przeciążone, aby wykonać wstawianie strumienia i podobne rzeczy, ale nadal są używane do przenoszenia liczb całkowitych.

Upewnij się, że rozumiesz wszystkie podstawowe funkcje C ++, których nie ma w C. Jeśli przeczytasz wystarczająco dużo stackoverflow.com, zobaczysz wiele pytań związanych z różnicami w językach i nieporozumieniami ludzi.

Powinieneś także zapoznać się z preprocesorem C, który jest prawie taki sam jak (i ​​często taki sam program jak) preprocesor C ++. Umiejętność korzystania z niego pomoże Ci w C ++, ale w C.

Jedną wielką rzeczą, z którą trudno jest sobie poradzić w C, którą posiada C ++, są destruktory. Te rzeczy można nazwać wszędzie, dbając o uwolnienie zasobów, ale w C musisz zrobić to wszystko bardziej wyraźnie. Programiści z C ++ łatwo o tym zapomnieli.

Jeśli chodzi o wywiady, jeśli ktoś poprosi cię o napisanie kodu dla jakiegoś ogólnego algorytmu w C i zrobisz coś takiego:

struct foo {
       int a;
       void * b;
};
foo x;  // in C++ this would work, but in C it would fail because struct names aren't in the
        // type name table unless you put them there with typedef

Nie sądzę, aby zdecydowali, że nie wiesz, co robisz, ponieważ nie zrobiłeś:

struct foo x;

I naprawdę nie powinny przejmować się tym, jeśli używałeś, coutchyba że próbują przekonać cię do twojej zdolności radzenia sobie z wejściami i wyjściami, co C ++ ułatwia w typowych przypadkach.

Jeśli znajdziesz się w sytuacji, w której przeprowadzana jest rozmowa kwalifikacyjna w sprawie pracy, która wymaga C, powinieneś szczerze powiedzieć o swojej nieznajomości C poza jego nakładaniem się z C ++. Prawdopodobnie zrozumieją, że dobry programista powinien być w stanie dość szybko przejść do C z C ++.

Biorąc to wszystko pod uwagę, C nie jest aż tak wielkim językiem. Standardowa biblioteka jest znacznie mniejsza niż biblioteka C ++ i zapoznanie się z najczęstszymi jej fragmentami nie jest wielkim problemem, więc nauczenie się jej nie zaszkodzi.

nategoose
źródło