Я беру класс в программировании на 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 (см. этот вопрос и этот, среди прочих).
Конечно, изучив С++, он может быть для них менее переносимым, чем с нуля, но это все еще делает ваш профессорский поступок неверным!