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

Sta*_*tec 10 c c++

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

不过我也看过,在地方这样

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

所以我的问题只有这个:

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

fuz*_*fuz 17

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

  • C具有C++中不存在的暂定定义的概念.
  • 在分配void指向具体类型变量的指针时,C不需要显式转换.
  • C对const传播有不同的规则.
  • C有一种称为"隐含int规则"的东西,虽然已经废除了C99,但有时会出现,需要加以考虑.
  • C预处理器具有C++预处理器所没有的一些功能.
  • C语言有两种函数定义,K&R-style和Stroustrup-style.C++只有Stroustrup风格.
  • C和C++的lexing规则是不同的,既不是另一个的子集
  • C和C++有不同的保留字集.这可能会导致奇怪的错误,因为在另一种语言中不允许使用标识符.
  • 虽然C++几乎采用了ANSI C(C89)的所有功能,但在C++中没有的后续标准版本中,许多功能都被添加到C中.
  • C++有不同的语法,即使对于某些非新的部分也是如此.例如,a ? b : c = dC中的语法错误,但a ? b : (c = d)在C++中解析.
  • 即使是空指针,C也保证&*E完全相同.C++没有这样的保证.EE
  • 在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);
    
    Run Code Online (Sandbox Code Playgroud)

    未定义的行为.

  • 还有一个:[C有"动态数组",C++没有](http://stackoverflow.com/questions/7458857/why-doesnt-c-support-dynamic-arrays-on-the-stack). (4认同)
  • @underscore_d当然C++有更好的动态容器,我不是说:-) (2认同)
  • @rwols:C也有复合语句,名为initializers,`restrict`和type-generic宏. (2认同)
  • @curiousguy在C++中,`char**`可以分配给`const char*const*`但是在C中是不可能的(参见ISO 9899:2011§6.5.16.11)因为C++有一个更复杂的法律规则`const`指针的赋值. (2认同)

und*_*e_d 5

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

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

除了通用语法和基本类型等非常基本的元素外,它们是两种独立发展的语言,应该这样处理(学习、编程)。


Gre*_*ill 5

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

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

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