С++ содержит весь язык 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. Есть еще много, но в конечном итоге вы сможете их изучить. Это в основном как изучение сленга английского.