Czy to prawda, że nie ma potrzeby uczenia się C, ponieważ C++ zawiera wszystko? [zamknięte]

Chodzę na zajęcia z programowania w C++ i profesor powiedział nam, że nie ma potrzeby uczyć się C, ponieważ C++ zawiera wszystko w C plus obiektowe funkcje. Jednak niektórzy inni powiedzieli mi, że niekoniecznie jest to prawdą. Czy ktoś może rzucić na to trochę światła?

 44
c
Author: Brian R. Bondy, 2008-09-28

11 answers

Przegląd:

Jest prawie prawdą, że C++ jest supersetem C, a twój profesor ma rację, że nie ma potrzeby uczyć się C oddzielnie.

C++ dodaje cały obiektowy aspekt, ogólny aspekt programowania, a także ma mniej ścisłe reguły(takie jak zmienne, które muszą być zadeklarowane u góry każdej funkcji). C++ zmienia definicję niektórych pojęć w C, takich jak struktury, chociaż nadal w sposób superset.

Przykłady dlaczego nie jest to ścisły superset:

Ten artykuł w Wikipedii ma kilka dobrych przykładów takich różnic:

Jedną z najczęściej spotykanych różnic jest że C umożliwia konwersję z void* do innych typów wskaźników, ale C++ nie. Tak więc, następujące jest ważne C kod:

int *i = malloc(sizeof(int) * 5);  

... ale żeby to działało zarówno w C jak i C++ trzeba by użyć jawnego Obsada:

int *i = (int *) malloc(sizeof(int) * 5)

Innym powszechnym problemem przenośności jest że C++ definiuje wiele nowe słowa kluczowe, takich jak nowa i klasy, które mogą być używane jako identyfikatory (np. zmienna nazwy) w programie C.

Ten artykuł ma również inne różnice:

Kompilatory C++ zabraniają goto krzyżowania inicjalizacji, tak jak w następującym kodzie C99:

 void fn(void)
 {
  goto flack;
  int i = 1;
 flack:
   ;
 }

Czego powinieneś się najpierw nauczyć?

Powinieneś najpierw nauczyć się C++, nie dlatego, że nauczenie się C najpierw cię boli, nie dlatego, że będziesz musiał się oduczyć cokolwiek (nie będziesz), ale dlatego, że nie ma korzyści w nauce C najpierw. W końcu i tak dowiesz się wszystkiego o C, ponieważ jest on mniej lub bardziej zawarty w C++.

 82
Author: Brian R. Bondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:35:06

Chociaż prawdą jest, że C++ został zaprojektowany w celu zachowania dużego stopnia kompatybilności z C i podzbiór tego, czego nauczysz się w C++, będzie miał zastosowanie do C, sposób myślenia jest zupełnie inny. Programowanie C++ za pomocą Boost lub STL jest zupełnie innym doświadczeniem niż programowanie w C.

Istniał termin sztuki zwany używaniem C++ jako lepszego C. oznaczało to użycie niektórych funkcji języka C++ i narzędzi ułatwiających programowanie w C (np. deklarowanie zmiennej indeksowej pętli for wewnątrz for oświadczenie). Ale teraz, współczesny rozwój C++ wydaje się bardzo różny od C innych niż duża część składni i w tych przypadkach dziedzictwo C często wydaje się być ciężarem, a nie korzyścią.

 11
Author: denis phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-24 23:29:41

Może być prawdą, że nie musisz uczyć się składni C, jeśli znasz składnię C++, ale musisz dowiedzieć się, jak różne są praktyki kodowania w C niż w C++.

Więc twój profesor nie miał 100% racji.
W C nie masz klas, aby ułożyć swój kod w Moduły logiczne i nie masz polimorfizmu C++. Jednak nadal musisz jakoś osiągnąć te cele.
chociaż składnia C jest w pewnym stopniu podzbiorem C++, programowanie W C jest nie jest podzbiorem programowania w C++. jest zupełnie inaczej.
 7
Author: shoosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 05:14:44

Tak i nie.

Jak już odpowiedzieli inni, język C++ jest supersetem języka C, z kilkoma małymi wyjątkami, na przykład, że sizeof ('x') daje inną wartość.

Ale myślę, że nie zostało jasno powiedziane, że jeśli chodzi o użycie tych dwóch języków, C++ nie jest supersetem, ale raczej innym. C++ zawiera nowe (można je omówić, jeśli są lepsze) sposoby robienia podstawowych rzeczy, takich jak pisanie do ekranu. Stare Sposoby C nadal istnieją, ale zazwyczaj używasz nowych sposobów. Oznacza to, że prosty program "hello world" wygląda inaczej w C i w C++. Tak więc nie jest tak naprawdę prawdą, że proste rzeczy są takie same w C i C++, a następnie po prostu dodać bardziej zaawansowane rzeczy, takie jak wsparcie dla programowania obiektowego, w C++.

Więc jeśli nauczyłeś się C++, będziesz musiał wiele się nauczyć, zanim będziesz mógł programować w C. (Cóż, możliwe jest nauczanie C++ jako rozszerzenia do C, nadal używając printf i malloc zamiast iostreams i new, a potem dodawanie klas i innych rzeczy C++, ale ten sposób korzystania z C++ jest generalnie marny.)

 5
Author: Thomas Padron-McCarthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 06:20:16

No C++ nie jest tak naprawdę superset C. Możesz sprawdzić ten artykuł, aby uzyskać bardziej obszerną listę różnic, jeśli jesteś zainteresowany: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

 4
Author: orlando calresian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:16:07

Nie do końca prawda.

Największym "gotcha" jest typowanie -- C++ jest znacznie silniej typowane niż C, a preferowane metody rozwiązywania tego w C++ są po prostu niedostępne w C. mianowicie, można po cichu rzucać między typami W C( szczególnie typy wskaźników), ale nie w C++. C++ wysoce zaleca używanie metod static_cast/reinterpret_cast/const_cast do rozwiązywania tych problemów.

Co ważniejsze, jeśli nauczysz się składni i manieryzmów C++, będziesz prawdopodobnie trudno jest sobie poradzić z C (niektórzy mogą powiedzieć, że jest to dobre; i wolę C++ osobiście, ale czasami po prostu nie jest to opcja, lub musisz poradzić sobie ze starszym kodem, który jest w C, a nie C++). W C++ używanie std::string i std:: vector lub innych kolekcji jest po prostu lepsze ).

Z pewnością można nauczyć się C++, a potem poznać różnice między C i C++ i być zdolnym do programowania w obu. Ale różnice są znacznie więcej niż tylko Głębokie na skórę.

 4
Author: Zathrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:29:48

Prawdą jest, że dla większości celów, C++ zawiera wszystko, co C robi. Prawnicy języka szybko zwrócą uwagę, że istnieje kilka bardzo szczególnych przypadków, które są poprawne C, ale nie poprawne C++.

Jednym z takich przykładów może być deklaracja C

int virtual;

Który deklaruje liczbę całkowitą o nazwie "virtual". Ponieważ "virtual" jest słowem kluczowym w C++, nie jest to poprawne C++.

 3
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:11:30

Istnieje duży wspólny rdzeń C (szczególnie C89) i C++, ale są z pewnością obszary różnic między C i C++. Oczywiście, C++ ma wszystkie funkcje obiektowe, plus ogólne programowanie, Plus wyjątki, Plus przestrzenie nazw, których C nie ma. Jednak istnieją również funkcje, które nie są w C++, takie jak wsparcie dla (blisko archaicznej) notacji nie-prototypowej do deklarowania i definiowania funkcji. W szczególności znaczenie następującej deklaracji funkcji jest inny w C i C++:

extern void function();

W C++ jest to funkcja, która nie zwraca żadnej wartości i nie pobiera żadnych parametrów (i dlatego jest wywoływana wyłącznie ze względu na efekty uboczne, niezależnie od tego, czym są). W C jest to funkcja, która nie zwraca żadnej wartości, ale dla której nie ma informacji o liście argumentów. C nadal nie wymaga deklaracji w zakresie przed wywołaniem funkcji( ogólnie; musisz mieć deklarację w zakresie, jeśli funkcja pobiera zmienną listę argumentów, więc jest krytyczne dla #include <stdio.h> przed użyciem printf(), itp.).

Istnieją również różnice:

sizeof('c')

W C++, odpowiedź wynosi 1; W C, odpowiedź jest zwykle 4 (32-bitowe systemy z 8-bitowymi znakami) lub nawet 8 (64-bitowe systemy z 64-bitowym int).

Ogólnie można pisać kod, który będzie kompilowany zarówno pod kompilatorami C jak i C++ bez większych trudności - większość mojego kodu robi to cały czas. Wyjątki są albo wynikiem niedbalstwa z mojej strony, albo dlatego, że świadomie wykorzystuje dobre cechy C99, które nie są w C++ 98, takie jak wyznaczone inicjalizatory lub long long.

 3
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:29:27

Stroustrup on Sam radzi przeciw nauka C najpierw. Jednak z drugiej strony, On (i wielu innych z jego pokolenia) udało mu się zostać guru C++ zaczynając od C. {]}

 3
Author: Kensai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-21 09:28:24

Ja osobiście nie zgadzam się z Twoim profesorem.

Ogólnie Rzecz Biorąc, C++ jest oparty na C i w tym "sensie" zawiera go i rozszerza.

Jednakże, ponieważ tradycyjnie ludzie uczyli się C, a dopiero potem rozszerzeń C++, stwierdzenie twojego profesora jest błędne, ponieważ aby poprawnie używać C++ trzeba by opanować C++. Jest możliwe, że przy nauczaniu czegoś, twój profesor lub podręcznik nie wspomni dokładnie tego, z czego język.

Ponadto ważne jest, aby zrozumieć, że pomimo podobieństw, nie każdy program C działa w ten sam sposób pod C++. Na przykład, struktury C są różnie interpretowane (jako klasy ze wszystkim, co publiczne) przez kompilator C++.

Kiedy uczę, najpierw uczę rdzeń C, a potem idę do c++.

 2
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:12:52

Jeśli któryś z uczniów w klasie zamierza zostać inżynierami oprogramowania wbudowanego, może nie mieć innego wyboru niż programować w języku C (zobacz to pytanie i to pytanie , między innymi).

Oczywiście, po nauczeniu się C++, może to być dla nich mniej przejścia niż zaczynanie od zera - ale to nadal sprawia, że stwierdzenie twojego profesora jest nieprawdziwe!

 0
Author: Steve Melnikoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:13