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

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保证&*EE完全相同,即使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
    8
    union 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的隐式赋值。还有很多,但最终你将能够学习这些。基本上就像学习英语俚语一样。