C 和 C++ 之间的区别

C语言简介

C 语言由 Dennis Ritchie 在 1972 年在贝尔电话实验室开发,主要作为一种系统编程语言(一种用于编写操作系统的语言)。Ritchie 的主要目标是生成一种易于编译、允许有效访问内存、生成高效代码并且独立(不依赖其他程序)的简约语言。对于高级语言来说,它的设计目的是为程序员提供很多控制权,同时仍然鼓励平台(硬件和操作系统)独立性(即不必为每个平台重写代码)。

C 最终变得如此高效和灵活,以至于在 1973 年,Ritchie 和 Ken Thompson 使用 C 重写了大部分 Unix 操作系统。许多以前的操作系统都是用汇编语言编写的。与汇编产生只能在特定 CPU 上运行的程序不同,C 语言具有出色的可移植性,使 Unix 可以轻松地在许多不同类型的计算机上重新编译并加速其采用。C 和 Unix 的命运紧密相连,而 C 的流行在一定程度上与 Unix 作为操作系统的成功息息相关。

1983 年,美国国家标准协会 (ANSI) 成立了一个委员会,为 C 制定正式标准。1989 年(委员会花了很长时间做任何事情),他们完成并发布了 C89 标准,通常称为 ANSI C。 1990 年,国际标准化组织 (ISO) 采用了 ANSI C(进行了一些小的修改)。这个版本的 C 被称为 C90。编译器最终变得符合 ANSI C/C90 标准,并且需要最大可移植性的程序也按照此标准进行编码。

1999年,ISO委员会发布了C的新版本,称为C99。C99 采用了许多已作为扩展进入编译器或已在 C++ 中实现的功能。

C++简介

C++(发音为“see plus plus”)是由贝尔实验室的 Bjarne Stroustrup 于 1979 年开发的,作为 C 的扩展。C++ 为 C 语言添加了许多新功能,但最好将其视为 C 的超集。这并不完全正确(因为 C99 引入了一些 C++ 中不存在的功能)。C++ 的声誉主要源于它是一种面向对象的语言。至于什么是“对象”以及它与传统编程方法有何不同,我们将在后面的章节中介绍。

C++ 于 1998 年由 ISO 委员会标准化(这意味着 ISO 标准委员会批准了一份描述 C++ 语言的文档,以帮助确保所有编译器遵守同一组标准)。该语言的一个小更新于 2003 年发布(称为 C++03)。

此后,C++ 语言(C++11、C++14、C++17、C++20 和 C++23)进行了五次重大更新,每次都添加了附加功能。C++11 特别添加了大量新功能,被广泛认为是该语言的新基线版本。未来该语言预计每三年左右升级一次。

该语言的每个新的正式版本称为语言标准(或语言规范)。标准以发布年份命名。例如,没有 C++15,因为 2015 年没有新标准。

C和C++相似之处

  • 这两种语言都有相似的语法。
  • 两种语言的代码结构相同。
  • 两种语言的编译是相似的。
  • 它们共享相同的基本语法。几乎所有 C 的运算符和关键字也出现在 C++ 中,并且执行相同的操作。
  • C++ 的语法比 C 稍有扩展,但基本语法是相同的。
  • 两者的基本内存模型非常接近硬件。
  • 这两种语言中都存在相同的堆栈、堆、文件范围和静态变量的概念。

C和C++的区别

C++ 通常被视为 C 的超集。 C++ 也被称为“带有类的 C” 这在 C++ 最初创建时几乎是正确的,但是随着时间的推移,这两种语言随着 C 的选择而不断发展。增加了许多在当代版本的 C++ 中未找到或尚未出现在任何 C++ 版本中的功能。也就是说,C++ 仍然主要是 C 的超集,添加了面向对象编程、异常处理、模板化和更广泛的标准库。 

下表列出了 C 和 C++ 之间的一些更明显和一般的差异。语言之间以及语言版本之间存在许多更细微的差异。

CC++
C 是由 Dennis Ritchie 在 1969 年至 1973 年间在 AT&T 贝尔实验室开发的。C++ 由 Bjarne Stroustrup 于 1979 年开发。
C不支持多态、封装和继承,这意味着C不支持面向对象编程。C++ 支持多态、封装和继承,因为它是一种面向对象的编程语言。
C(大部分)是 C++ 的子集。C++(大部分)是 C 的超集。
C 中的关键字数量: 
* C90:32 
* C99:37 
* C11:44 
* C23:59
C++ 中的关键字数量: 
* C++98:63 
* C++11:73 
* C++17:73 
* C++20:81
对于代码的开发,C支持过程式编程。C++ 被称为混合语言,因为 C++ 同时支持过程式和面向对象的编程范例。
C 中的数据和函数是分离的,因为它是一种过程编程语言。在C++中,数据和函数以对象的形式封装在一起。
C不支持信息隐藏。数据被封装隐藏,以确保数据结构和运算符按预期使用。
C 中支持内置数据类型。C++ 支持内置和用户定义的数据类型。
C 是一种函数驱动语言,因为 C 是一种过程编程语言。C++ 是一种对象驱动语言,因为它是面向对象的编程。
C 不支持函数和运算符重载。C++ 支持函数和运算符重载。
C 是一种函数驱动语言。C++是一种对象驱动语言
C 中的函数不在结构内部定义。函数可以在 C++ 的结构内部使用。
命名空间功能不存在于 C 内部。C++ 使用命名空间,避免名称冲突。
标准 IO 标头是stdio.h。标准 IO 头是iostream.h。
C 不支持引用变量。C++ 支持引用变量。
C 不支持虚拟函数和友元函数。C++ 支持虚函数和友元函数。
C不支持继承。C++ 支持继承。
C 不关注数据,而是关注方法或过程。C++ 关注数据而不是方法或过程。
C 提供了malloc()和calloc()函数用于动态内存分配,以及free() 函数用于内存解除分配。C++ 提供了用于内存分配的new 运算符和用于内存解除分配的删除运算符。
C 不支持对异常处理的直接支持。C++ 支持异常处理。
scanf()和 printf() 函数用于 C 中的输入/输出。cin 和 cout用于C++ 中的输入/输出。
C 结构没有访问修饰符。C++ 结构具有访问修饰符。
C遵循自上而下的方法C++遵循自下而上的方法
C 编程语言没有严格的类型检查。在 C++ 中完成严格的类型检查。很多在C编译器中运行良好的程序在C++编译器下会出现很多警告和错误。
C不支持重载C++确实支持重载
允许使用联合的类型双关(C99 及更高版本)使用联合的类型双关是未定义的行为(除非在非常特殊的情况下)
命名初始化程序可能会出现乱序命名初始值设定项必须与结构的数据布局匹配
文件扩展名是“.c”文件扩展名是“.cpp”或“.c++”或“.cc”或“.cxx”
元编程:宏+ _Generic()元编程:模板(仍然支持宏,但不鼓励)
C语言中有32个关键字C++中有97个关键字