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

时间:2015-07-19 20:04:23

标签: c++ c

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

但是我也在like this那个地方读过

  

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

所以我的问题只有这个:

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

5 个答案:

答案 0 :(得分:16)

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

  • C具有暂定词的概念,但在C ++中并不存在。
  • C不需要在赋值给具体类型变量的void指针时进行显式转换。
  • 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 = d是C中的语法错误,但在C ++中解析为a ? b : (c = d)
  • C保证&*EE完全相同,即使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);
    

    未定义的行为。

答案 1 :(得分:4)

  

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

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

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

  

我不确定"差异"可能存在......

例如like this one

  

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

答案 4 :(得分:-1)

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