Стоит ли изучать C перед изучением C ++? [закрыто]

116

Сегодня я посетил день открытых дверей на факультете компьютерных наук в университете, и во время экскурсии по лабораториям мы сели, чтобы поиграть с парой проектов последних курсов студентов бакалавриата. Один был особенно хорош - своего рода игра FPS с астероидами. Я решил заглянуть в srcкаталог, чтобы найти, что это было сделано на C ++ (большинство других проектов были приложениями Java 3D).

Раньше я не занимался C, но уже просматривал код C. От того, что я видел в коде .cpp в этой игре, он не сильно отличался.

Я заинтересован в изучении C или C ++, но, вероятно, позже изучу другой. Есть ли у меня преимущество в изучении одного перед другим, и если да, то какой?

Росс
источник
Дубликат: stackoverflow.com/questions/171126/…
Дэвид Сегондс,
7
На самом деле это не дубликат. Неявно в этом вопросе также задается вопрос: «Следует ли мне сначала изучить ООП или процедурное программирование»
bobobobo
2
Перед спуском к ниже ответы (IMO они идут по кругу), позвольте мне предложить несколько советов: ИСТИНА : C ++ действительно сохраняет все функции и атрибуты применяются к C, таким образом , косвенно « obsoleting » C (точка большинство ответов ниже попытки делать). ОДНАКО : C нет , нет , НЕ МЕРТВОЙ. Люди, кажется, хватаются за тропу «нет необходимости учить и то, и другое », но на самом деле это не имеет никакого основания. Для заема синтаксиса происходящий от C, C ++! = C . Знание C ++ НЕ сделает вас квалифицированным разработчиком C, и точно так же знание C НЕ сделает вас квалифицированным разработчиком C ++.
Super Cat
4
ЭТО СКАЗАНО : Нет ничего плохого в том, чтобы взять C перед тем, как углубиться в C ++ - Чем больше вы знаете, тем лучше - Но, наоборот, нет необходимости изучать C, если ваша конечная цель - изучить C ++ . Если вы хотите узнать , C ++, идут учиться C ++ , и если вы хотите узнать , т C, идут учиться C . У обоих есть свои плюсы и минусы (простота C и особенности C ++ по-своему являются проклятиями и благословениями), и оба они все еще используются сегодня (C для встроенных систем, Unity, PHP и т. Д. - C ++ также для Unity, Unreal и т. д.).
Super Cat
3
ПУНКТ: Хотите изучить C ++? Тогда пропустите C. Вам это не нужно. Хотите выучить C? Тогда хорошо, иди учите C. Если вы хотите изучить оба, сначала переходите к C. У них обоих есть свое место в мире, поэтому не думайте, что одного достаточно для другого.
Super Cat

Ответы:

121

Нет необходимости изучать C перед изучением C ++.

Это разные языки . Распространено заблуждение, что C ++ каким-то образом зависит от C, а не как полностью определенный язык сам по себе.

Тот факт, что C ++ имеет один и тот же синтаксис и много одинаковой семантики, не означает, что вам нужно сначала изучить C.

Если вы изучите C ++, вы в конечном итоге выучите большую часть C с некоторыми различиями между языками, которые вы выучите со временем. На самом деле, очень сложно написать правильный C ++, потому что программисты среднего уровня C ++ обычно пишут C / C ++. Это верно независимо от того, начали вы с C или начали с C ++.

Если вы сначала знаете C, то это хороший плюс к изучению C ++. Вы начнете с знания языка. Если вы сначала не знаете C, то нет смысла сосредотачиваться на другом языке. Существует множество хороших книг и учебных пособий, которые начнут вас с нуля и охватят все, что вы узнаете из C, что применимо и к C ++.

См. Дальнейшие рассуждения в этом ответе .

Брайан Р. Бонди
источник
33
Я не мог больше не согласиться. Изучение C ++ вначале делает очень трудным «возвращение» к C. C - это фундаментальный системный язык, предназначенный только для базовых знаний. C ++ - это совершенно новая игра, подходы к любой проблеме на любом языке будут сильно отличаться. Мне посчастливилось повозиться с C, прежде чем приступить к работе над C ++. Впоследствии я могу мысленно «выпарить» синтаксический сахар, который предоставляет C ++, и могу решать проблемы с любым языком. Мне очень легко идентифицировать C как часть языковой пары, которая занимается «чем-то особенным». Изучение C ++ вначале приведет к путанице и введению в заблуждение программистов.
Мэтт Джойнер
24
@Matt: Сначала я изучил C ++, и я не заблуждающийся программист. Значит, ваше утверждение не соответствует действительности, доказательство встречным примером. И да, у меня тоже есть золотой значок на C. Дело в том, что это 2 разных и разных языка. Вам не нужен один язык как зависимость для изучения другого. Это просто глупое заблуждение.
Брайан Р. Бонди
8
@Matt: Также из моего связанного сообщения: Сначала вы должны изучить C ++ не потому, что сначала изучение C причинит вам вред, не потому, что вам придется от чего-то отучиться (вы не будете), а потому, что сначала нет пользы в изучении C. В конце концов, вы все равно узнаете о C практически все, потому что он более или менее содержится в C ++.
Брайан Р. Бонди
11
@Matt: Мне жаль, что ты все еще не понимаешь. Нарисуйте диаграмму Венна для языков C и C ++ и посмотрите на пересекающиеся части. C ++ состоит из всего круга C ++, который вы рисуете, а не только из частей, которые не пересекаются. Если вы сначала познакомитесь с C, это хорошо для вас, вы сможете выучить C ++ быстрее. Если вы не знаете C в первую очередь, нет причин для его изучения. Считаете ли вы, что каждая книга по C ++ не будет охватывать указатели и управление памятью, строковые литералы и т. Д.? Я собираюсь прекратить обсуждение сейчас, но не стесняйтесь оставлять свои заключительные комментарии.
Брайан Р. Бонди,
11
@Matt: как C помогает лучше понять C ++? Обычно программисты на C, которые изучают C ++, в конечном итоге пишут уродливый, подверженный ошибкам код в стиле «C с классами». Я не говорю, что это всегда происходит, но это наиболее естественный прогресс, когда начинается с C, потому что C гораздо ближе к этому ужасному стилю C ++, чем к «современному» C ++.
jalf
77

Мне нравится этот вопрос - это все равно что спрашивать: «Чему я должен научиться в первую очередь, кататься на сноуборде или лыжах»? Я думаю, это зависит от того, хотите ли вы кататься на сноуборде или на лыжах. Если вы хотите сделать и то, и другое, вы должны изучить оба.

В обоих видах спорта вы спускаетесь с холма по снегу, используя устройства, которые достаточно похожи, чтобы вызвать этот вопрос. Однако они также достаточно разные, так что изучение одного не очень помогает вам с другим. То же самое с C и C ++. Хотя они кажутся языками, достаточно похожими по синтаксису, образ мышления, необходимый для написания объектно-ориентированного кода и процедурного кода, достаточно отличается, так что вам в значительной степени придется начинать с самого начала, какой бы язык вы ни изучали вторым.

cdonner
источник
70

Я сначала изучил C, и я прошел курс структур данных, которые используют C, прежде чем я изучил C ++. У меня это хорошо сработало. Курс по структурам данных на языке C дал мне твердое понимание указателей и управления памятью. Это также сделало очевидными преимущества объектно-ориентированной парадигмы, как только я узнал, что это такое.

С другой стороны, сначала изучив C, я выработал некоторые привычки, которые изначально заставляли меня писать плохой код на C ++, например, чрезмерное использование указателей (когда справились бы ссылки на C ++) и препроцессора.

C ++ - действительно очень сложный язык с множеством функций. Однако на самом деле это не надмножество C. Скорее есть подмножество C ++, состоящее из основных процедурных программных конструкций (циклов, ifs и функций), которые очень похожи на C.В вашем случае я бы начал с этого, а затем перешел к более продвинутым концепциям. как классы и шаблоны.

ИМХО, самое важное - познакомиться с различными парадигмами программирования, такими как процедурные, объектно-ориентированные, функциональные и логические, на раннем этапе, прежде чем ваш мозг застынет и не сможет смотреть на мир одним взглядом. Кстати, я также настоятельно рекомендую вам изучить функциональный язык программирования, например Scheme. Это действительно расширит ваш кругозор.

Дима
источник
18

Если вы решили изучить оба (и, как уже упоминали другие, нет явной необходимости изучать оба), сначала изучите C. Переход от C к C ++ кажется естественным прогрессом; идти в другую сторону - все равно что умышленно завязать одну руку за спиной. :-)

Главный Компьютерщик
источник
13

Я думаю, вам следует сначала выучить C, потому что я сначала выучил C. C дал мне хорошее представление о синтаксисе и подводных камнях с такими вещами, как указатели, которые все перетекают в C ++.

Я думаю, что C ++ упрощает завершение всех этих ошибок (нужен массив, который не будет переполняться, когда вы используете оператор [] и хитрый индекс? Конечно, создайте класс массива, который проверяет границы), но вам нужно знать, что они есть, и они кусаются, прежде чем вы поймете, почему все делается определенным образом.

Когда все сказано и сделано, то, как обычно преподают C ++, звучит так: «C ++ - это C с объектами, вот материал C и вот как все это OO-штука работает», так что вы, вероятно, изучите базовый C раньше любого реального C ++, если вы все равно следите за большинством текстов.

Адам Хоуз
источник
Я не согласен. Любая книга по программированию на C ++, достойная внимания, будет охватывать по крайней мере некоторые из "подводных камней", например, как работают массивы (и как предотвратить переполнение)
moonman239
12

Я собираюсь не согласиться с большинством здесь. Я думаю, вам следует изучить C, прежде чем изучать C ++. Это определенно не обязательно, но я думаю, что это значительно упрощает изучение C ++. C лежит в основе C ++. Все, что вы узнаете о C, применимо к C ++, но C намного меньше по размеру и его легче изучить.

Возьмите K&R и прочтите это. Он короткий и даст вам достаточное чувство языка. Когда вы освоите основы указателей и вызовов функций, вы можете немного легче перейти к C ++.

Стив Роу
источник
15
Неправильно. Практически все, чему вас учит C, является плохой практикой в ​​C ++. C не лежит в основе C ++, просто у него много общего синтаксиса. Пожалуйста, в мире уже более чем достаточно программистов "Си с классами". Изучите C или C ++. Но не притворяйтесь, что C - это облегченный C ++.
jalf 01
13
Я верю своим словам. C ++ построен на основе C, и поэтому C лежит в его основе. Идиомы, используемые в C ++, сильно отличаются от используемых в C, но синтаксис тот же. Можно узнать, как правильно программировать C ++, начиная с C. Посмотрите C ++ Primer. Это в основном так.
Стив Роу,
6
+1. C - меньший по размеру язык, поэтому его легче выучить. Попытка обеспечить обратную совместимость с C - одна из основных проблем C ++, другая - система шаблонов, слишком сложная для использования 90% программистов на C ++.
hillu 01
1
Понимание переменных, типов [включая указатели и квалификации], области действия, функций, препроцессора и связывания важно как для C, так и для C ++. Я бы сказал, что изучение этих концепций с помощью C будет проще, так что вам не придется также иметь дело со знанием классов, другого значения static, шаблонов (и смехотворно устрашающих ошибок шаблонов, которые выдают компиляторы) и т. Д.
dreamlax
1
У вас есть пункт. На самом деле, может быть полезно изучить C, чтобы затем перейти к C ++, лучше зная его корни.
Daniel Daranas
10

В процессе изучения C ++ вы также выучите большую часть C. Но имейте в виду, что большая часть кода C ++ недействительна C. C ++ был разработан для совместимости с кодом C, поэтому я бы сказал, сначала изучите C ++. Брайан написал отличный ответ по этому поводу.

Джон Т
источник
8

Как и ответы на многие другие вопросы в жизни, это зависит от обстоятельств. Это зависит от ваших программных интересов и целей. Если вы хотите программировать настольные приложения, возможно, с графическим интерфейсом, то C ++ (и ООП), вероятно, лучший способ. Если вас интересует аппаратное программирование на чем-то другом, кроме набора микросхем x86, то C часто является лучшим выбором, обычно из-за его скорости. Если вы хотите создать новый медиаплеер или написать бизнес-приложение, я бы выбрал C ++. Если вы хотите провести научное моделирование столкновений галактик или гидродинамики, обратите внимание на мощь C.

Скотти Т
источник
4
Во многих сценариях высокопроизводительных вычислений эти несколько сотен тактовых циклов действительно имеют значение.
Scottie T
1
@ScottieT: Учитывая, что кроме restrictспецификатора C не имеет другой синтаксической / семантической конструкции, связанной с производительностью, кроме C ++, почему именно, как вы думаете, код C ++ с его более богатым синтаксисом и, например, метапрограммированием должен давать более медленный код? Вы вообще знаете шаблоны выражений?
Себастьян Мах
1
@phresnel: Актуальность. C ++ - чрезвычайно сложный язык с функциями, которые часто не стоят того, чтобы покупать его. Как правило, C дает те же возможности производительности, что и C ++, при значительно меньшей стоимости в плане сложности.
Мэтт Джоунер
1
@MattJoiner: Ремонтопригодность / расширяемость также являются факторами производительности, хотя я понимаю, что научный код часто одноразовый. Однако, повторяя аргумент-шаблон-выражение (в качестве примера), я говорю, что С ++ имеет больше возможностей оптимизации (также потому, что легче написать код-шаблон-выражение, чем внутренний-код), с одним исключением ( restrictкоторое, однако все основные компиляторы C ++ предоставляют как расширение). И действительно ли вы думаете, что при одном и том же коде будет какая-то разница в производительности между C ++ и C при использовании одного и того же компилятора? [...]
Себастьян Мах
1
@MattJoiner: [...], и когда я читаю такие утверждения, как «так сильно, как я не люблю С ++», я могу сделать предположение, что вы слегка предвзяты в этом обсуждении. Как вы думаете, что именно снижает производительность кода C ++? Если C имеет те же возможности производительности, что эквивалентно шаблонам выражений, шаблонам в целом, вычислениям во время компиляции для не внутренних типов данных, функторам? И добавление фактора стоимости / ремонтопригодности: RAII, перегрузка операторов / функций, общие стандартные контейнеры, стандартные потоки, общие стандартные алгоритмы, ссылки?
Себастьян Мах
8

Изучение C заставляет вас больше думать о некоторых проблемах, таких как явное и неявное управление памятью или размеры хранилища базовых типов данных во время написания кода.

Когда вы достигнете точки, в которой вы будете чувствовать себя комфортно с особенностями и недостатками C , у вас, вероятно, будет меньше проблем с обучением и написанием на C ++.

Вполне возможно, что код C ++, который вы видели, не сильно отличался от стандартного C, но это вполне может быть потому, что он не был объектно-ориентированным и не использовал исключения, объектную ориентацию, шаблоны или другие расширенные функции.

hillu
источник
8

Я считаю, что сначала изучить C - это хорошая идея.

Есть причина, по которой в курсах компьютерных наук до сих пор используется C.

На мой взгляд, это сделано для того, чтобы избежать "скопления" предмета, которое несет обязательство требовать ООП.

Я считаю, что процедурное программирование - самый естественный способ научиться программированию. Я думаю, что это правда, потому что в конце концов это то, что у вас есть: строки кода, выполняющиеся одна за другой.

Многие тексты сегодня продвигают подход «сначала объекты» и начинают говорить об автомобилях и переключениях передач до того, как вводят массивы.

bobobobo
источник
4
Кажется, что в наши дни многие курсы по компьютерным наукам используют Java, что усугубляет проблему, о которой вы говорите.
Дима
2
Вы сделали очень хорошее замечание. Помимо того, что он слишком сложен для первого языка, C ++ по большей части поощряет сокрытие низкоуровневого взаимодействия с операционной системой и памятью, которое имеет решающее значение для хорошего обучения информатике. Массивы следует обучать задолго до объектов.
Мэтт Джойнер
1
С другой стороны, если вы неплохо разбираетесь в математике, функциональное программирование может быть более естественным, потому что оно выглядит, ощущается и работает более знакомо.
Себастьян Мах
2
«Есть причина, по которой на курсах компьютерных наук до сих пор используется C.» Да, потому что большинство компьютерных курсов плохо преподаются.
Гонки легкости на орбите
8

Нет.

Как правило, более полезно изучать C ++, потому что он ближе к наиболее современным языкам, основанным на объектно-ориентированных объектах, таким как Eiffel или C #.

Если ваша цель - изучить C ++, изучите в первую очередь современный стандартный C ++. Оставьте маллоки в стороне.


Но Стив Роу прав ...

Даниэль Даранас
источник
В настоящее время C ++ не ближе к объектно-ориентированным языкам, таким как C # или Eifel.
einpoklum
7

Наблюдая за людьми, которые сначала изучили Java, борются с концепциями указателей и управления памятью в C ++, я бы сказал, что сначала изучение C - хорошая идея, чтобы понять эти две концепции, изолированные от сложностей другого C ++. функции.

TrayMan
источник
6

Мои два цента:

Я предлагаю сначала изучить C, потому что:

  • это фундаментальный язык - многие языки произошли от C
  • компилятор C поддерживается большим количеством платформ, чем C ++, - будь то встроенные системы, чипы GPU и т. д.
  • согласно индексу TIOBE, C по-прежнему примерно в 2 раза популярнее C ++.
Агниус Василяускас
источник
3

Я думаю, что c - действительно хороший язык программирования, он компактен и довольно прост в изучении. но если вы хотите изучить только C ++, начните с C ++. но я предлагаю вам изучить оба. и если вы хотите это сделать; Думаю, лучше начать с c. как уже было сказано: он небольшой и довольно легкий в освоении. может стать хорошим шагом вперед к более сложному языку программирования, например, C ++. (поскольку c дает вам некоторые основы)

удачи.

Марникс против Р.
источник