![](/img/trans.png)
[英]Q&A: Where can i find the drafts of all C Standards (C89,C90,C99,C11,C18) and C++ Standards (C++98,C++03,C++11,C++17) as PDFs for free? [on hold]
[英]Does C++ include C99 or C89?
我即将学习C++。
C语言的语法有两种。 指针和数组。
它们是在 C 标准中定义的,有很多子条款。 我知道 C++ 是 C 的超集(它可能是一种概括)。 那么这些特性和C++一样吗? 如果是这样,什么版本的 C++ 有什么版本的 C?
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++ 在 C 被标准化之前就已经存在,因此最初不可能基于任何标准。 两种语言都是从这个共同的根源演变而来的,并朝着自己的方向发展。
另外,请注意,尽管许多 C 习语在 C++ 中工作,但它们在 C++ 中不是习语,被认为是一种不好的做法。 据我了解,高度兼容的原因(超出编写通用头文件的能力)是将 C 程序移植到 C++ 的简便性,允许它以小的增量步骤进行转换。 例如,从来没有理由在 C++ 中编写NULL
,也几乎没有理由编写malloc
。
Stroustrup 本人在其主页https://www.stroustrup.com/bs_faq.html#C-is-subset上解决了这个问题。 关键点(强调我的):
C 和 C++足够不同,最好将它们视为完全独立的语言,而不是将它们视为另一个的超或子集。 有无数合法的 C 程序不是合法的 C++ 程序,还有无数合法的 C 程序也是合法的 C++ 程序,但行为不同或产生不同的结果。 虽然它们确实共享一个很大的语法和语义的公共子集,但它们之间存在足够的差异,如果相同的代码在编译为 C 与 C++ 时给您不同的结果,您应该永远不会感到惊讶。
设计良好且编写良好的 C++ 程序在外观或行为上与设计良好且编写良好的 C 程序不同。
编辑
这是我如何绘制两者之间的关系:
+------------------------------+
| Valid C++ Only |
| |
| +-----------------------+-------+
| | Valid C and C++ with | Valid |
| | identical behavior | C |
| | | Only |
| | | |
| | | |
| +-----------------------+ |
| | Valid C and C++ with | |
| | different behavior | |
| +-----------------------+-------+
| |
| |
+------------------------------+
这两种语言有一个非常大的公共子集,它们之间的行为方式相同。 有一个较小的公共子集,其行为有所不同。 相对较少的 C 也不是有效的 C++,但是如果您尝试从 C 移植到 C++ 或支持两者之间的相同代码,这足以引起问题。 同样,我认为将它们视为完全独立的语言会更好。 你不太可能以这种方式感到惊讶。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.