C++ 编程/编程语言/比较/C
C 基本上是 C++ 的核心语言,当 Bjarne Stroustrup 决定创建一个“更好的 C”时。许多语法约定和规则仍然适用,因此我们甚至可以说明 C 是 C++ 的一个子集。大多数最近的 C++ 编译器也可以编译 C 代码,考虑到微小的不兼容性,因为 C99 和 C++ 2003 现在不再兼容。您还可以查看有关 C 语言的更多信息,请访问 C 编程维基教科书.
C++ 由 1998 年的 ANSI 标准定义(有时称为 C++98)几乎是,但并非完全是 1989 年首个 ANSI 标准定义的 C 语言(称为 C89)的超集。C++ 不是严格超集的原因有很多,即并非所有有效的 C89 程序都是有效的 C++ 程序,但将 C 代码转换为有效的 C++ 代码的过程相当简单(避免保留字,通过强制转换绕过更严格的 C++ 类型检查,声明每个调用的函数,等等)。
1999 年,C 被修订,并增加了许多新特性。截至 2004 年,大多数这些新的“C99”特性不在 C++ 中。有些人(包括 Stroustrup 本人)认为 C99 中带来的更改与 C++98 在 C89 中添加的更改具有不同的理念,因此这些 C99 更改旨在增加 C 和 C++ 之间的兼容性。
这些语言的合并似乎是一个死问题,因为 C 和 C++ 标准委员会的协调行动并未取得实际成果,可以说这些语言开始出现分化。
一些差异是
- C++ 支持函数重载,这在 C 中不存在,尤其是在 C89 中(可以争论,根据函数重载的定义松散程度,可以使用 C99 标准在一定程度上模拟这些功能)。
- C++ 支持 继承 和 多态性。
- C++ 添加了关键字 class,但保留了来自 C 的 struct,具有兼容的语义。
- C++ 支持类成员的访问控制。
- C++ 通过使用 模板 支持泛型编程。
- C++ 使用自己的标准库扩展了 C89 标准库。
- C++ 和 C99 提供不同的复数功能。
- C++ 将 bool 和 wchar_t 作为基本类型,而在 C 中它们是类型定义。
- C++ 比较运算符返回 bool,而 C 返回 int。
- C++ 支持运算符重载。
- C++ 字符常量具有类型 char,而 C 字符常量具有类型 int。
- C++ 有特定的 强制转换运算符 (
static_cast
,dynamic_cast
,const_cast
和reinterpret_cast
)。 - C++ 添加了 mutable 关键字来解决物理常量和逻辑常量之间的不完美匹配。
- C++ 通过引用扩展了类型系统。
- C++ 支持 成员函数、构造函数和析构函数,用于用户定义的类型来建立不变量和管理资源。
- C++ 支持 运行时类型识别 (RTTI),通过 typeid 和
dynamic_cast
。 - C++ 包含 异常处理。
- C++ 有std::vector作为其标准库的一部分,而不是 C 中的可变长度数组。
- C++ 将
sizeof
运算符视为编译时操作,而 C 允许它成为运行时操作。 - C++ 有 new 和 delete 运算符,而 C 使用 malloc 和 free 库函数。
- C++ 支持面向对象编程,无需扩展。
- C++ 不需要使用宏,不像 C,它使用宏来进行小心地信息隐藏和抽象(这对于 C 代码的可移植性尤其重要)。
- C++ 支持由 // 表示的单行注释。(C99 开始正式支持此注释系统,大多数编译器都支持此作为扩展。)
- C++
register
关键字在语义上与 C 的实现不同。
通常会有人推荐使用 C 而不是 C++(反之亦然),或者抱怨这些语言的某些特性。通常没有决定性的理由在一般情况下偏爱一种语言而不是另一种语言。大多数试图将程序员工作效率作为编程语言函数进行测量的科学研究将 C 和 C++ 评为基本相同。C 可能更适合某些情况,例如内核编程,例如硬件驱动程序或关系数据库,这些情况不适合面向对象编程。另一个考虑因素是 C 编译器更普遍,因此 C 程序可以在更多平台上运行。虽然两种语言仍在发展,但添加的任何新功能仍然保持与旧代码的高度兼容性,使程序员可以决定是否使用这些新结构。在项目中建立规则以限制使用语言的一部分(例如 RTTI、异常或内部循环中的虚函数)并不罕见,具体取决于程序员的能力或项目的需要。新硬件首先支持较低级别的语言也很常见。由于 C 比 C++ 更简单、更低级,因此更容易检查和符合行业指南。C 的另一个好处是,程序员可以更轻松地进行低级别优化,尽管大多数 C++ 编译器可以自动保证几乎完美的优化。
最终,程序员可以选择最适合工作的工具。如果可用程序员只知道 C,那么很难证明选择 C++ 来进行项目。即使在相反的情况下,预计 C++ 程序员会生成功能性 C 代码,但所需的思维方式和经验并不相同。同样的推理也适用于 C 程序员和 ASM。这是由于这些语言的结构和历史演化之间存在密切关系。
有人可能会认为,仅使用 C++ 编译器编译的 C++ 的 C 子集与只使用 C 相同,但实际上,根据使用的编译器,它可能会生成略有不同的结果。