Чи слід вивчати C, перш ніж вивчати C ++? [зачинено]


116

Я відвідав сьогодні день відкритих дверей університетського відділу CS, і в екскурсії по лабораторіях ми сіли пограти з парою проектів випускних курсів студентів-студентів. Один був особливо гарний - це така собі гра FPS з астероїдами. Я вирішив заглянути в srcкаталог, щоб виявити, що це робиться на C ++ (більшість інших проектів були додатками Java 3D).

Я раніше не робив жодного C, але раніше я переглянув якийсь код C. З того, що я бачив у .cpp-коді в цій грі, він виглядав не дуже інакше.

Мені цікаво вивчати або C, або C ++, але, мабуть, дізнаюся інше пізніше. Чи є якась перевага мені вчитися один перед іншим, і якщо так, то який?



7
Це насправді не дублікат. Неодмінно це питання також задає питання "чи слід спочатку навчитися OOP чи процедурному програмуванню"
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 ++ також для Єдності, Нереального тощо).
Супер Кіт

3
ТОЧКА: Хочете вивчити C ++? Потім пропустіть C. Це вам не потрібно. Хочете навчитися C? Тоді добре, перейдіть, вивчіть C. Якщо ви хочете навчитися обох, тоді перейдіть до С. Вони обоє мають своє місце у світі, тому не думайте, що іншого достатньо для іншого.
Супер Кіт

Відповіді:


121

Немає необхідності вивчати С до того, як вивчити С ++.

Вони різні мови . Поширена помилкова думка, що 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 ++, і я не введений в оману програміст. Тож ваша претензія не відповідає дійсності, підтвердження зустрічним прикладом. І так, у мене теж є золотий знак у С. Істина полягає в тому, що вони є двома різними і різними мовами. Вам не потрібна одна мова як залежність, щоб вивчити іншу. Це просто дурне оману.
Брайан Р. Бонді

8
@Matt: Також з моєї пов’язаної публікації: Ви повинні спочатку вивчити C ++, не тому, що вивчення C спочатку зашкодить вам, не тому, що вам доведеться щось вивчити (ви цього не зробите), а тому, що в навчанні C спочатку немає ніякої користі. Зрештою, ви все-таки дізнаєтесь про все, що стосується C, оскільки він більше чи менше міститься в C ++.
Брайан Р. Бонді

11
@Matt: Вибачте, ви все ще не розумієте. Накресліть діаграму Венна C і C ++ і подивіться на частини, що перетинаються. C ++ складається з цілого кола C ++, який ви малюєте, не лише частин, які не перетинаються. Якщо ви спочатку знаєте C, що добре для вас, ви можете навчитися C ++ швидше. Якщо ви, звичайно, не знаєте С першими, немає ніяких причин для того, щоб дізнатися його спочатку. Ви припускаєте, що кожна книга на C ++ не буде охоплювати покажчики та управління пам’яттю, а також рядкові літерали тощо? Я зараз перестану обговорювати, але не соромтесь залишати свої заключні коментарі.
Брайан Р. Бонді

11
@Matt: як C призводить до кращого розуміння C ++? Зазвичай програмісти на C, які вивчають C ++, закінчують писати некрасивий, схильний до помилок код стилю "C з класами". Я не кажу, що це завжди буває, але це найприродніший прогрес, починаючи з C, оскільки C набагато ближче до того жахливого стилю C ++, ніж до "сучасного" C ++.
jalf

77

Мені подобається це питання - це як запитати "чого я повинен спочатку навчитися, сноуборду чи лижам"? Я думаю, це залежить від того, хочете ви сноуборд чи кататися на лижах. Якщо ви хочете робити і те, і інше, ви повинні навчитися обом.

В обох видах спорту ви ковзаєте по схилу пагорба по снігу, використовуючи прилади, досить схожі, щоб спровокувати це питання. Однак вони також досить різні, так що навчання одного не допоможе тобі багато в чому. Те саме і з C і C ++. Незважаючи на те, що вони виглядають досить сильно схожими за синтаксисом, але розумовий набір, необхідний для написання коду OO проти процесуального коду, є досить різним, щоб вам довелося починати спочатку, якою б мовою ви не займалися.


70

Спершу я вивчив С, і я пройшов курс з структур даних, які використовували C, перш ніж я вивчив C ++. Це добре спрацювало для мене. Курс структур даних у С дав мені чітке розуміння покажчиків та управління пам’яттю. Це також стало очевидним переваг об'єктно-орієнтованої парадигми, як тільки я дізнався, що це таке.

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

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

Найголовніше, IMHO, піддаватись різним парадигмам програмування, як процедурним, об'єктно-орієнтованим, функціональним та логічним, на початку, перш ніж ваш мозок застигне в один спосіб погляду на світ. Між іншим, я також настійно рекомендую вивчити функціональну мову програмування, наприклад, Scheme. Це дійсно розширить ваш кругозір.


18

Якщо ви вирішили навчитися обом (і, як згадували інші люди, немає явної необхідності вчитися обом), вивчіть спершу С. Перехід від C до C ++ відчуває себе як природний прогрес; в інший бік відчувається, ніби навмисно зав'язуєш одну руку за спиною. :-)


13

Я думаю, що ви повинні вивчити С першим, тому що я навчився С першим. 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 ++ lite.
залф

13
Я стою біля своїх слів. C ++ побудований на вершині C, і, отже, C лежить в основі. Ідіоми, які використовуються в C ++, значно відрізняються від тих, що використовуються в C, але синтаксис той самий. Можна навчитися правильно програмувати C ++, починаючи з C. Подивіться на C ++ Primer. Це в основному це робить.
Стів Роу

6
+1. C - менша мова, тому її легше вивчити. Спроба бути зворотним сумісним із C є одним із найважливіших проблем C ++, іншою є система шаблонів, яка надто складна для використання 90% програмістів на C ++.
Hillu

1
Розуміння змінних, типів (включаючи покажчики та кваліфікації), сфери, функції, препроцесора та зв’язку є важливим як для C, так і для C ++. Я б сказав, що вивчення цих понять за допомогою C буде простішим, так що вам не доведеться також мати справу з класами знань, іншим значенням staticшаблонів (і смішно залякуючими помилками шаблонів, які випускають компілятори) тощо.
dreamlax

1
Ти правий. Насправді, може бути добре вивчити C, щоб потім можна було перейти до C ++ з кращим знанням його коренів.
Даніель Даранас

10

У процесі вивчення C ++ ви також вивчите більшість C. Але майте на увазі, що багато C ++-коду недійсне C. Брайан написав чудову відповідь з цього приводу.


8

Як і відповіді на багато інших питань у житті, це залежить. Це залежить від ваших інтересів та цілей програмування. Якщо ви хочете запрограмувати настільні додатки, можливо, з графічним інтерфейсом, то C ++ (і OOP) - це, мабуть, кращий шлях. Якщо ви зацікавлені в апаратному програмуванні на чомусь іншому, ніж чіпсет x86, то C часто є кращим вибором, як правило, для його швидкості. Якщо ви хочете створити новий медіа-плеєр або написати діловий додаток, я вибрав C ++. Якщо ви хочете зробити наукове моделювання зіткнень галактики або динаміки рідини, дивіться на силу C.


4
У багатьох високоефективних сценаріях обчислень ці кількасот годинних циклів дійсно мають значення.
Scottie T

1
@ScottieT: З огляду на те, що крім restrictспецифікатора C немає іншої синтаксичної / семантичної конструкції, пов'язаної з продуктивністю, ніж C ++, чому саме ви вважаєте, що код C ++ з його ситнішим синтаксисом і, наприклад, метапрограмування повинен давати повільніший код? Ви навіть знаєте шаблони виразів?
Себастьян Мах

1
@phresnel: Відповідність. C ++ - надзвичайно складна мова з функціями, які часто не варто купувати. Як правило, C дає ті ж можливості для продуктивності, що і C ++ за значно менших за складністю витрат.
Метт Столяр

1
@MattJoiner: Обслуговуваність / розширюваність також є чинниками ефективності, хоча я розумію, що науковий код часто є одним. Однак, повторюючи вираз-шаблони-аргументи (як приклад), я кажу, що C ++ має більше можливостей для оптимізації (також тому, що простіше писати вираз-шаблон-код, ніж внутрішній код), за одним винятком ( restrictякий, однак, усі основні компілятори C ++ надаються як розширення). І чи справді ви думаєте, що, враховуючи той самий код, буде різниця у продуктивності між C ++ і C, якщо цей самий компілятор? [...]
Себастьян Мах

1
@MattJoiner: [...], і коли читати висловлювання на кшталт "наскільки мені не подобається C ++", я дозволяє створити припущення, що ви трохи упереджені в цій дискусії. Як ви думаєте, що саме робить код C ++ більш поганим? Якщо C має однакові можливості для продуктивності, що таке еквівалент шаблонів виразів, шаблонів загалом, обчислень у часі компіляції на невластивих типах даних, функторах? І додавання коефіцієнта витрат / ремонтопридатності: RAII, перевантаження оператора / функції, загальні стандартні контейнери, стандартні потоки, загальні стандартні алгоритми, посилання?
Себастьян Мах

8

Навчання C змушує вас більше задуматися над деякими проблемами, такими як явне та неявне управління пам’яттю або розмірами зберігання основних типів даних під час написання коду.

Як тільки ви дістанетесь до точки, коли ви відчуваєте себе комфортно навколо особливостей та недоліків C , у вас, ймовірно, буде менше проблем із навчанням та написанням на C ++.

Цілком можливо, що код C ++, який ви бачили, не виглядав сильно відмінним від стандартного C, але це цілком може бути тому, що він не був об'єктно орієнтований і не використовував винятку, орієнтацію на об'єкти, шаблони чи інші розширені функції.


8

Я думаю, що спочатку вивчення C - це гарна ідея.

Існує причина, що на комп’ютерних курсах все ще використовується C.

На мою думку, це дозволяє уникнути будь-якого «скупчення» предмета зобов'язання вимагати ООП.

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

Сьогодні багато текстів підштовхують підхід "спочатку до об'єктів" і починають говорити про машини та перемикання передач, перш ніж вводити масиви.


4
Здається, що сьогодні багато курсів комп’ютерів використовують Java, що посилює проблему, про яку ви говорите.
Діма

2
Ви дуже добре вказуєте. Окрім того, що є надто складним для першої мови, C ++ здебільшого заохочує приховувати взаємодію низького рівня з операційною системою та пам'яттю, які є критичними для хорошого навчання інформатики. Масиви слід навчати задовго до об'єктів.
Метт Столяр

1
З іншого боку, якщо ви не погані в математиці, функціональне програмування може бути більш природним, оскільки воно виглядає і відчуває себе і працює більш звично.
Себастьян Мах

2
"Існує причина, що на комп’ютерних курсах все ще використовується C." Так, бо більшість курсів з комп’ютерних наук погано викладаються.
Гонки легкості по орбіті

8

Немає.

Взагалі корисніше вивчати C ++, оскільки це ближче до найсучасніших мов на основі ОО, таких як Ейфелева або C #.

Якщо ваша мета - вивчити C ++, в першу чергу вивчайте сучасні, стандартні C ++. Малок залиште в стороні.


Але Стів Роу має сенс ...


Сьогодні C ++ не наближається до таких мов OO, як C # або Eifel.
einpoklum

7

Спостерігаючи за тим, як люди, які спочатку дізналися Java, борються з поняттями покажчиків та управління пам’яттю в С ++, я б сказав, що вивчення C спочатку - це гарна ідея, щоб зрозуміти ці два поняття, відокремлені від складності інших C ++ особливості.


6

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

Я пропоную вивчити спершу, оскільки:

  • це основна мова - багато мов походить із С
  • більше платформ підтримує компілятор C, ніж C ++, - будь то вбудовані системи, чіпи GPU тощо.
  • за індексом TIOBE C все ще приблизно в 2 рази популярніший за C ++.

3

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

Щасти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.