Does C++ contain the entire C language?
我已经阅读教程,C++包含了整个C语言。
但是我也读过,在这样的地方
If you learn C++ you will eventually learn most of C with some differences between the languages that you will learn over time.
号
所以我的问题是:
如果我非常了解C++,我会最终学会"真正的"C语言(没有任何差异)吗?因为C++ 11中包含了完整的C90语言吗?
不,C++不是C语言的超集。虽然C++包含了很大一部分C,但是细微的差别会在你最不期望的地方咬你。以下是一些例子:
- C具有在C++中不存在的暂定定义的概念。
- c不需要在将
void 指针分配给具体类型的变量时进行显式转换。 - c对于
const 传播有不同的规则。 - C有一种称为"隐式
int 规则"的东西,虽然在C99中被废除了,但有时会出现这种情况,需要加以考虑。 - C预处理器具有C++预处理器不具备的一些特性。
- C语言有两种类型的函数定义:k&r样式和stroustrup样式。C++只有StruouUp风格。
- C和C++的词法规则不同,它们都不是另一个子集的子集。
- C和C++有不同的保留词集。这可能会导致奇怪的错误,因为另一种语言中不允许使用标识符。
- 虽然C++从ANSI C(C89)中获取了几乎所有的特征,但是在C++中不可用的后续标准修订中,许多特征被添加到C中。
- C++有不同的语法,甚至对于一些不新的部分也是如此。例如,EDCOX1 OR 3是C中的语法错误,但在C++中被解析为EDCOX1(4)。
- c保证
&*E 与E 完全相同,即使E 是一个空指针。C++没有这样的保证。 - 在C语言中,初始化字符数组的字符串文字可以初始化一个数组,该数组至少与不带尾随的
\0 字节的字符串一样长。(即char foo[3] ="bar" 是合法的)。在C++中,数组至少必须与包含后缀EDCOX1×8字节的字符串一样长。 - 在C语言中,像
'A' 这样的字符文字具有int 类型。在C++中,它具有EDCOX1类型13Ω。 C有一个特殊的规则,使通过工会进行的类型惩罚成为合法的。C++缺少这样的语言,生成代码,如
1
2
3
4
5
6
7
8union intfloat {
int i;
float f;
} fi;
fi.f = 1.0;
printf("%d
", fi.i);未定义的行为。
从广义上讲,C++语言本质上是C语言,加上了一堆面向对象的东西。几乎所有可以用C编写的代码也可以在C++中编译和运行。
然而,语言中有一些角落存在差异。随着时间的推移,这些语言的数量一直在缓慢增长,但语言变化的速度还不够快,因此这是一个重大问题。
如果你只学习C++,那么是的,你最终也会学习C语言的几乎所有方面。如果你成为C++专家,那么你就能够识别和理解C和C++相似部分之间存在细微差别的地方。
If I know C++ very well, will I eventually learn the"real" C language (without any"differences")
号
如果你正确地学习C++,你可能不需要使用在C.中使用的许多标准技术,理论上你可以编程C++中几乎所有的C语言,并且已经引入了异常。然而,在现实中,你不会或不应该这样做。这是因为C++是一种不同的语言,它提供了一个非常不同的工具集。
除了诸如一般语法和基本类型等非常基本的元素之外,它们是两种独立发展的语言,因此应该对它们进行处理(学习、编程)。
I am not sure what"differences" might exist...
号
例如,像这样:
In C:
void foo() means"a function foo taking an unspecified number of arguments of unspecified type"
[...]
In C++:
void foo() means"a function foo taking no arguments"
号
如果你先学习C++,你就可以很容易地学习整个C库。有些语法有点不同,还有一些较小的区别。正如Kerreksb所说,这方面的一个例子是类型的双关语规则和来自void的隐式赋值。还有很多,但最终你将能够学习这些。基本上就像学习英语俚语一样。