Верно ли, что нет необходимости изучать C, потому что С++ содержит все?

Я беру класс в программировании на C++, и профессор сказал нам, что нет необходимости изучать C, потому что С++ содержит все в объектах C плюс объектно-ориентированные функции. Однако некоторые другие говорили мне, что это не обязательно так. Может ли кто-нибудь пролить свет на это?

Ответ 1

Обзор:

Почти верно, что С++ - это надмножество C, и ваш профессор прав в том, что нет необходимости изучать C отдельно.

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

Примеры того, почему он не является строгим надмножеством:

В этой статье в Википедии есть несколько хороших примеров таких различий:

Часто встречающаяся разница что C допускает неявное преобразование из void * другим типам указателей, но С++ не. Итак, справедливо C код:

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

... но чтобы он работал как на C, так и на С++ нужно было бы использовать явный В ролях:

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

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

Эта статья в википедии имеет следующие отличия:

Компиляторы С++ запрещают переходить с инициализации, как в следующем коде C99:

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

Что вы должны сначала изучить?

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

Ответ 2

Хотя верно, что С++ был разработан, чтобы поддерживать большую степень совместимости с C, и подмножество того, что вы изучаете на С++, применимо к C, мышление совершенно другое. Программирование С++ с Boost или STL - это совсем другой опыт, чем программирование на C.

Был назван термин искусства, использующий С++ как лучший C. Это означало использование некоторых языковых возможностей С++ и инструментов для упрощения программирования на C (например, объявление индексной переменной цикла for внутри оператора for). Но теперь современная разработка на С++ кажется очень отличной от C, кроме синтаксиса, и в тех случаях наследие C часто кажется скорее бременем, чем выгодой.

Ответ 3

Возможно, вам не нужно изучать синтаксис языка C, если вы знаете синтаксис С++, но вам ясно нужно знать, как разные методы кодирования в C, чем в С++.

Итак, ваш профессор не был на 100% прав.
В C у вас нет классов для упорядочивания кода в логические модули, и у вас нет полиморфизма С++. Тем не менее вам все равно нужно достичь этих целей. хотя синтаксис C в некоторой степени является подмножеством С++, программирование в C не является подмножеством программирования на С++. он совершенно другой.

Ответ 4

Да и нет.

Как уже говорили другие, язык С++ является надмножеством языка C с некоторыми небольшими исключениями, например sizeof ('x') дает другое значение.

Но я не думаю, что было очень ясно сказано, что, когда дело доходит до использования этих двух языков, С++ не является супермножеством, а скорее другим. С++ содержит новые (может быть обсужден, если они лучше) способы выполнения основных вещей, таких как запись на экран. Старые C-пути все еще существуют, но вы обычно используете новые способы. Это означает, что простая программа "hello world" выглядит по-разному в C и на С++. Поэтому на самом деле не так, что простые вещи одинаковы в C и С++, а затем вы просто добавляете более сложные материалы, такие как поддержка объектно-ориентированного программирования, в С++.

Итак, если вы изучили С++, вам нужно будет многому научиться, прежде чем вы сможете программировать на C. (Ну, можно преподавать С++ как расширение C, все еще используя printf и malloc вместо iostreams и новый, а затем добавление классов и других С++-вещей, но этот способ использования С++ обычно не одобряется.)

Ответ 5

Нет С++ не является надмножеством C. Вы можете проверить эту статью для более обширного списка различий, если вам интересно: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

Ответ 6

Не совсем верно.

Самый большой "gotcha" - печатать - С++ гораздо более строго типизирован, чем C, и предпочтительные методы для решения этого вопроса на С++ просто недоступны в C. А именно, вы можете беззвучно использовать между типами в C (в частности, типы указателей), но не в С++. И С++ настоятельно рекомендует использовать методы static_cast/reinterpret_cast/const_cast для решения этих проблем.

Что еще более важно, если вы изучите синтаксис и манеры С++, вам, вероятно, будет трудно справляться с C (некоторые могут сказать, что это хорошо, и я предпочитаю сам С++, но иногда это просто не вариант, или вам придется иметь дело с устаревшим кодом, который в C, а не С++). Опять же, наиболее вероятные проблемы, с которыми вы столкнетесь, касаются указателей (в частности, char * и использования общего массива, в С++ с использованием std::string и std::vector или другие коллекции просто лучше).

Конечно, можно изучить С++, а затем изучить различия между C и С++ и быть способными программировать в обоих. Но различия гораздо больше, чем просто глубокая кожа.

Ответ 7

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

Одним из таких примеров может быть объявление C

int virtual;

который объявляет целое число с именем "virtual". Поскольку "virtual" - это ключевое слово в С++, это недопустимо С++.

Ответ 8

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

extern void function();

В С++ это функция, которая не возвращает значения и не принимает никаких параметров (и, следовательно, называется исключительно для своих побочных эффектов, независимо от того, что они есть). В C это функция, которая не возвращает значения, но для которой нет информации о списке аргументов. C до сих пор не требует объявления в области до того, как вызывается функция (в общем случае вы должны иметь объявление в области видимости, если функция принимает переменную список аргументов, поэтому для использования #include <stdio.h> важно использовать printf() и т.д.).

Существуют также различия:

sizeof('c')

В С++ ответ равен 1; в C ответ обычно 4 (32-разрядные системы с 8-битными символами) или даже 8 (64-разрядные системы с 64-битным int).

В общем, вы можете написать код, который будет скомпилирован как с компиляторами C, так и с С++ без особых трудностей - большинство моих кодов делает это все время. Исключения являются либо результатом небрежности с моей стороны, либо потому, что я сознательно использовал хорошие функции C99, которые не находятся на С++ 98, такие как назначенные инициализаторы или long long.

Ответ 9

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

Ответ 10

Я лично не соглашусь с вашим профессором.

Вообще говоря, С++ основан на C и в том, что "смысл" содержит его и расширяет.

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

Кроме того, важно понимать, что, несмотря на сходство, не каждая программа C работает аналогично с С++. Например, C-структуры интерпретируются по-разному (как классы со всем общедоступным) компилятором С++.

Когда я учу, я сначала преподаю C-core, а затем перехожу на С++.

Ответ 11

Если кто-либо из учеников класса намеревается стать инженерами-разработчиками, то у них может не быть выбора, кроме как запрограммировать на C (см. этот вопрос и этот, среди прочих).

Конечно, изучив С++, он может быть для них менее переносимым, чем с нуля, но это все еще делает ваш профессорский поступок неверным!