С++ содержит весь язык C?
В учебниках я прочитал, что С++ содержит весь язык программирования C.
Однако я также читал в местах как это, которые
Если вы изучите С++, вы в конечном итоге узнаете большую часть C с некоторыми различиями между языками, которые вы будете изучать с течением времени.
Итак, мой вопрос заключается только в следующем:
Если я хорошо знаю С++, смогу ли я в конечном итоге изучить "настоящий" язык C (без каких-либо "отличий" ), потому что полный C90-язык включен в С++ 11?
Ответы
Ответ 1
Нет, С++ не является надмножеством языка C. В то время как С++ содержит большую часть C, есть тонкая разница, которая может сильно вас укусить, где вы меньше всего их ожидаете. Вот несколько примеров:
- C имеет понятие предварительных определений, которое не существует в С++.
- C не требует явного преобразования при назначении указателей
void
для переменных конкретного типа.
- C имеет разные правила относительно распространения
const
.
- C имеет нечто, называемое "неявным правилом
int
", которое, хотя и отменено с помощью C99, появляется несколько раз и должно быть рассмотрено.
- Препроцессор C имеет некоторые функции, которые препроцессор С++ не имеет.
- Язык C имеет два стиля определения функции: K & R-стиль и стиль Stroustrup. С++ имеет стиль Stroustrup.
- Правила лексики для C и С++ различаются, поскольку ни один из них не является подмножеством другого
- C и С++ имеют разные наборы зарезервированных слов. Это может вызвать странные ошибки, потому что идентификатор не разрешен на другом языке.
- В то время как С++ использовал почти все функции от ANSI C (C89), многие функции были добавлены в C в последующих стандартных версиях, которые недоступны на С++.
- С++ имеет другой синтаксис, даже для некоторых частей, которые не новы. Например,
a ? b : c = d
является синтаксической ошибкой в C, но анализируется как a ? b : (c = d)
в С++.
- C гарантирует, что
&*E
точно совпадает с E
, даже если E
является нулевым указателем. С++ не имеет такой гарантии.
- В C строковый литерал, инициализирующий массив символов, может инициализировать массив, который по крайней мере длиннее строки без байта
\0
. (т.е. char foo[3] = "bar"
является законным). В С++ массив должен быть как минимум до тех пор, пока строка содержит байт \0
.
- В C символьный литерал типа
'A'
имеет тип int
. В С++ он имеет тип char
.
-
C имеет специальное правило, позволяющее вводить права на использование типов в профсоюзах. С++ не хватает этого языка, создавая такой код, как
union intfloat {
int i;
float f;
} fi;
fi.f = 1.0;
printf("%d\n", fi.i);
undefined.
Ответ 2
Если я хорошо знаю С++, я в конце концов узнаю "настоящий" язык C (без каких-либо "различий" )
Если вы правильно изучите С++, вам, вероятно, не нужно будет использовать многие стандартные методы, используемые в C. Теоретически вы можете запрограммировать почти все C на С++, с уже введенными исключениями. Однако на самом деле вы не должны или не должны. Это связано с тем, что С++ - это другой язык, который при использовании оптимально использует отличный набор инструментов.
Помимо основных элементов, таких как общий синтаксис и фундаментальные типы, это два отдельно развивающихся языка, и к ним следует подходить (изучать, программировать) как таковые.
Ответ 3
В широком смысле язык С++ по существу является C с добавлением целой группы объектов, ориентированных на объекты. Почти весь код, который вы могли бы написать на C, также будет компилироваться и работать на С++.
Однако есть несколько углов языков, где есть различия. С течением времени их число постепенно растет, но языки не изменяются достаточно быстро, чтобы это было серьезной проблемой.
Если вы изучаете только С++, то да, вы в конце концов узнаете почти все аспекты языка C. Если вы станете экспертом в С++, вы сможете определить и понять места, где существуют небольшие различия между аналогичными частями C и С++.
Ответ 4
Я не уверен, какие "различия" могут существовать...
Например > как этот:
В C:
void foo() означает "функция foo, принимающая неопределенное число аргументов неуказанного типа"
[...]
В С++:
void foo() означает "функция foo без аргументов"
Ответ 5
Если вы сначала изучите С++, вы сможете довольно легко изучить всю C-библиотеку. Некоторые из синтаксиса немного отличаются от других меньших различий. Как и в случае с KerrekSB, примером этого могут быть правила кастомизации типа и неявное присвоение из void. Есть еще много, но в конечном итоге вы сможете их изучить. Это в основном как изучение сленга английского.