C 与 C++ 各个版本
C 各个版本说明
C 语言早期
- 最早由丹尼斯·里奇(Dennis Ritchie)为了在PDP-11电脑上运行的Unix系统所设计出来的编程语言
- 第一次发展在1969年到1973年之间。
- 在PDP-11出现后,丹尼斯·里奇与肯·汤普逊着手将Unix移植到PDP-11上
- 1973年,Unix操作系统的核心正式用C语言改写,这是C语言第一次应用在操作系统的核心编写上。
- 1975年C语言开始移植到其他机器上使用。史蒂芬·强生实现了一套“可移植编译器”
K&R c
- 1978年,丹尼斯·里奇和布莱恩·柯林汉合作出版了《C程序设计语言》的第一版。 “K&R C”(柯里C)。
C89/C90
- 1989年,C语言被美国国家标准协会(ANSI)标准化,这个版本又称为C89
- 标准化的一个目的是扩展 K&R C,增加了一些新特性。
- 1990年,国际标准化组织(ISO)规定国际标准的C语言
- 通过对 ANSI 标准的少量修改,最终制定了 ISO 9899:1990,又称为C90。
- 随后,ANSI亦接受国际标准C,并不再发展新的C标准。
注意: C89和C90是一回事,C89是由ANSI(American National Standards Institute)美国国家标准协会制定,C90 是由国际标准协会根据ANSI C89 制定。
C89/C90对K&R C改进点
- 增加了真正的标准库
- 新的预处理命令与特性
- 函数原型允许在函数申明中指定参数类型
- 一些新的关键字,包括 const、volatile 与 signed
- 宽字符、宽字符串与多字节字符
- 对约定规则、声明和类型检查的许多小改动与澄清
C99
- 1994年为C语言创建了一个新标准,但是只修正了一些C89标准中的细节和增加更多更广的国际字符集支持。
- 不过,这个标准引出了1999年ISO 9899:1999的发表。它通常被称为C99。
- C99被ANSI于2000年3月采用。
C99新特性(部分)
- 支持不定长的数组,声明时使用
int a[var]
的形式。 - 变量声明不必放在语句块的开头,
for
语句提倡写成for(int i=0;i<100;++i)
的形式 - 允许采用
(type_name){xx,xx,xx}
类似于 C++ 的构造函数的形式构造匿名的结构体。 - 除了已有的
__line__
__file__
以外,增加了__func__
得到当前的函数名。 - 取消了函数返回类型默认为
int
的规定。 - 增加和修改了一些标准头文件(定义bool的、定义复数的、里增加了 struct tmx,对 struct tm 做了扩展。)
C11
- 2011年12月8日,ISO正式发布了新的C语言的新标准C11,之前被称为C1X
- 官方名称为ISO/IEC 9899:2011
- 新的标准提高了对C++的兼容性,并增加了一些新的特性。
- 这些新特性包括泛型宏、多线程、带边界检查的函数、匿名结构等。
C18
- C18没有引入新的语言特性,只对C11进行了补充和修正
C++ 各个版本说明
- 1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准。
- 2009年,C++标准有了一次更新,一般称该草案为C++0x。
- C++0x是C++11标准成为正式标准之前的草案临时名字。
- 后来,2011年,C++新标准标准正式通过,更名为ISO/IEC 14882:2011,简称C++11。
C++11
C++11,先前被称作C++0x,即ISO/IEC 14882:2011,是C++编程语言的一个标准。
它取代第二版标准ISO/IEC 14882:2003 (第一版ISO/IEC 14882:1998公开于1998年, 第二版于2003年更新,分别通称C++98以及C++03,两者差异很小),且已被C++14取代
C++11 新特性(部分)
auto 关键字及用法
C++11 之前,auto 具有存储期说明符的语义。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。
nullptr 关键字及用法
引入nullptr,是因为重载函数处理 NULL 的时候会出问题,二义性
|
|
for循环语法
for ( 范围声明 : 范围表达式 ) 循环语句
STL – std::array
std::array 提供了静态数组,编译时确定大小、更轻量、更效率,当然也比 std::vector 有更多局限性。
STL – std::forward_list
单向链表
STL – unordered_map
STL – unordered_set
多线程 – std::thread
在 C++11 以前,C++ 的多线程编程均需依赖系统或第三方接口实现,一定程度上影响了代码的移植性。C++11 中,引入了 boost 库中多线程的部分内容,形成标准后的接口与 boost 库基本没有变化,这样方便了使用者切换使用 C++ 标准接口。
多线程 – std::atomic
从实现上,可以理解为这些原子类型内部自己加了锁。
多线程 – std::condition_variable
智能指针 – std::shared_ptr
智能指针 – std::weak_ptr
其它 – std::function
其它 – std::bind
lambda
C++14
C++14 旨在作为C++11的一个小扩展,主要提供漏洞修复和小的改进。2014年8月18日,经过C++标准委员投票,C++14标准获得一致通过。ISO/IEC 14882:2014
C++17
C++17 又称C++1z,是继 C++14 之后,C++ 编程语言 ISO/IEC 标准的下一次修订的非正式名称。官方名称 ISO/IEC 14882:2017
基于 C++ 11,C++ 17 旨在简化该语言的日常使用,使开发者可以更简单地编写和维护代码。
C++ 17是对 C++ 语言的重大更新