C ++是否包含整个C语言?

我在教程中读到C ++包含整个C编程语言。

不过我也读过这样的地方

如果您学习C ++,您最终将学习大部分C语言,并且随着时间的推移,您将学习一些语言之间的差异。

所以我的问题只有这个:

如果我非常了解C ++,我最终会学习“真正的”C语言(没有任何“差异”),因为完整的C90语言包含在C ++ 11中吗?

不,C ++不是C语言的超集。 虽然C ++包含C的很大一部分,但是有一些细微的差别会让你在最不期望的地方咬人。 这里有些例子:

  • C具有C ++中不存在的暂定定义的概念。
  • C不需要在赋值给具体类型变量的void指针时进行显式转换。
  • C对const传播有不同的规则。
  • C有一种叫做“隐含的内部规则”的东西,虽然已经废除了C99,但有时会出现,需要加以考虑。
  • C预处理器具有C ++预处理器所没有的一些function。
  • C语言有两种函数定义,K&R-style和Stroustrup-style。 C ++只有Stroustrup风格。
  • C和C ++的lexing规则是不同的,既不是另一个的子集
  • C和C ++有不同的保留字集。 这可能会导致奇怪的错误,因为在其他语言中不允许使用标识符。
  • 虽然C ++几乎采用了ANSI C(C89)的所有function,但在C ++中没有的后续标准版本中,许多function都被添加到C中。
  • C ++有不同的语法,即使对于某些非新的部分也是如此。 例如, a ? b : c = d a ? b : c = d是C中的语法错误但是解析为a ? b : (c = d) a ? b : (c = d) C ++中的a ? b : (c = d)
  • C保证&*E完全相同,即使E是空指针。 C ++没有这样的保证。
  • 在C中,初始化字符数组的字符串文字可以初始化一个数组,该数组至少与没有尾随\0字节的字符串一样长。 (即char foo[3] = "bar"是合法的)。 在C ++中,数组必须至少与包含尾随\0字节的字符串一样长。
  • 在C中,像'A'这样的字符文字具有int类型。 在C ++中,它有char类型。
  • C有一个特殊的规则,通过工会使打字成为合法的。 C ++缺乏这种语言,使得代码如此

     union intfloat { int i; float f; } fi; fi.f = 1.0; printf("%d\n", fi.i); 

    未定义的行为。

如果我非常了解C ++,我最终会学习“真正的”C语言(没有任何“差异”)

如果你正确学习C ++,你可能不需要使用C语言中使用的许多标准技术。理论上你可以用C ++编写几乎任何C语言,但已经引入了例外。 但是,实际上,你不会 – 或者不应该 。 这是因为C ++是一种不同的语言,在最佳使用时提供了一组非常不同的工具。

除了一般语法和基本类型等非常基本的元素之外,这些是两种不同的演化语言,它们应该被接近(学习,编程)。

从广义上讲,C ++语言基本上是C语言,并添加了大量面向对象的东西。 几乎所有用C编写的代码也可以在C ++中编译和运行。

但是,语言中有一些角落存在差异。 随着时间的推移,这些语言的数量一直在缓慢增长,但语言的变化不足以使其成为一个重大问题。

如果您学习C ++,那么是的,您最终将学习C语言的几乎所有方面。 如果您成为C ++的专家,那么您将能够识别和理解C和C ++的相似部分之间存在细微差别的地方。

我不确定可能存在什么“差异”……

比如这个 :

在C:
void foo()表示“函数foo采用未指定数量的未指定类型的参数”
[…]
在C ++中:
void foo()表示“函数foo不带参数”

如果您首先学习C ++,您将能够非常轻松地学习整个C库。 一些语法与其他一些较小的差异略有不同。 就像KerrekSB所说的那样,这样的例子就是Type punning规则和void的隐式赋值。 还有更多,但最终你将能够学到这些。 这基本上就像学习英语俚语一样。