C++ 包括 C99 还是 C89?

op *_* ol 1 c c++

我即将学习C++。
C语言的语法有两种。指针和数组。
它们是在 C 标准中定义的,有很多子条款。我知道 C++ 是 C 的超集(它可能是一种概括)。那么这些特性和C++一样吗?如果是这样,什么版本的 C++ 有什么版本的 C?

eer*_*ika 10

C++ 包括 C99 还是 C89?

目前,虽然 C 和 C++ 的公共子集很重要,但 C++ 不包括它的全部内容。缺少某些功能,并且语言之间存在不兼容的差异。C++ 标准“兼容性/C++ 和 ISO C [diff.iso]”和“C 标准库 [diff.library]”的非规范部分列出了(部分)差异。

但是,C++“基于”C 标准并且确实引用了它。以下是最新标准草案的引述:

[介绍范围]

C++ 是一种基于 C 编程语言的通用编程语言,如 ISO/IEC 9899:2018 编程语言 — C(以下简称 C 标准)中所述。C++ 提供了许多超出 C 提供的工具......

[介绍.refs]

以下文件在正文中的引用,其部分或全部内容构成本文件的要求。对于注明日期的参考文献,仅适用所引用的版本。对于未注明日期的参考文献,适用参考文件的最新版本(包括任何修订)。

  • ...
  • ISO/IEC 9899:2018,编程语言 — C
  • ...

ISO/IEC 9899:2018 第 7 条中描述的库在下文中称为 C 标准库。


什么版本的 C++ 有什么版本的 C?

  • C++20 基于 C18
  • C++17 基于 C11
  • C++14 基于 C99
  • C++11 基于 C99
  • C++03 基于 C89/C90
  • C++98 基于 C89/C90

从历史的角度来看,(标准前的)C++ 在 C 被标准化之前就已经存在,因此最初不可能基于任何标准。两种语言都是从这个共同的根源演变而来的,并朝着自己的方向发展。

另外,请注意,尽管许多 C 习语在 C++ 中工作,但它们在 C++ 中不是习语,被认为是一种不好的做法。据我了解,高度兼容的原因(超出编写通用头文件的能力)是将 C 程序移植到 C++ 的简便性,允许它以小的增量步骤进行转换。例如,从来没有理由NULL用 C++编写,也几乎没有理由编写malloc.