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的隐式赋值。 还有更多,但最终你将能够学到这些。 这基本上就像学习英语俚语一样。