C语言的发展
历史
开端
1970到80年代,C语言被广泛应用,从大型主机到小型微机,也衍生了C语言的很多不同版本.
统一
为统一C语言版本,1983年美国国家标准局(American National Standards Institute,简称ANSI)成立了一个委员会,来制定C语言标准.
1989年C语言标准被批准,被称为ANSI X3.159-1989 "Programming Language C".这个版本的C语言标准通常被称为ANSI C.又由于这个版本是 89 年完成制定的,因此也被称为C89.
1990年,被 ISO 采纳为国际标准,称为 ISO C.又因为这个版本是1990年发布的,因此也被称为C90.
ANSI C(C89) 与 ISO C(C90)内容基本相同,所以,ANSI C、ISO C、C89、C90,这些标准的内容都是相同的.
发展
1995年C程序设计语言工作组对C语言进行了一些修改,并成为后来的1999年发布的 ISO/IEC 9899:1999标准,通常被成为C99
2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会(ISO/IEC JTC1/SC22/WG14)正式发布了C11标准
变化
C99相对于C89的变化
支持了可变参数的宏(Variadic Macro)
支持 // 行注释(这个特性实际上在C89的很多编译器上已经被支持了)
增加了新关键字 restrict,inline,_Complex,_Imaginary,_Bool
支持 long long,long double _Complex,float _Complex 这样的类型
支持 <: :> <% %> %: %:%: ,等等奇怪的符号替代,D&E 里提过这个
支持了不定长的数组.数组的长度就可以用变量了.声明类型的时候呢,就用 int a[*]
变量声明不必放在语句块的开头,for 语句提倡这么写 for(int i=0;i<100;++i) 就是说,int i 的声明放在里面,i 只在 for 里面有效.
复合字面量:当一个类似结构的东西需要临时构造的时候,可以用 (type_name){xx,xx,xx} 这有点像 C++ 的构造函数
相较于C89标准,C99标准新增了一种结构体/数组的初始化方式,名叫designated initializers[8],即:struct { int a[3], b; } w[] ={ [0].a = {1}, [1].a[0] = 2 };[9]
字符串里面,\u 支持 unicode 的字符
支持 16 进制的浮点数的描述
所以 printf和scanf 的格式化串增加了支持 "%lld"和"%llu",对应long long int类型和unsigned long long int类型(可以分别简写为long long和unsigned long long).
增加了一个内置的局部静态字符数组变量func,可以用于得到当前函数的函数名[10] .
对于非常量的表达式,也允许编译器做化简
修改了 /% 处理负数时的定义,这样可以给出明确的结果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可 以-22 / 7= -4, -22% 7 = 6. 而C99中明确为 -22 / 7 = -3, -22% 7 = -1,只有一种结果.
取消了不写函数返回类型默认就是 int 的规定
允许 struct 定义的最后一个数组写做 [] 不指定其长度描述
const const int i; 将被当作 const int i; 处理
输入输出对宽字符还有长整数等做了相应的支持
C99标准中引进了long long int(-263至263 - 1)和unsigned long long int(0到264 - 1).long long int能够支持的整数长度为64位.
C11相对于C99的变化
对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件 .
_Noreturn 函数标记.
_Generic 关键词,有点儿类似于 gcc 的 typeof.
静态断言( static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理.
删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s().
新的 fopen() 模式,(“…x”).类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用.
匿名结构体/联合体.
多线程支持.
_Atomic类型修饰符和 头文件 .
带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等.
改进的 Unicode 支持,新的头文件 等.
新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition).
创建复数的宏, CMPLX().
更多浮点数处理的宏 .
struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get().
编译器支持
vc++ 只支持C89,不支持C99和C11的.
C++语言的发展
历史
开端
1983年,贝尔实验室的Bjarne Stroustrup在C语言基础上推出了C++。
C++这个名字是Rick Mascitti于1983年中所建议的,并于1983年12月首次使用。
起步
1985年公布的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。
1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。
1993年的C++语言3.0版本是C++语言的进一步完善,其中最重要的新特征是模板(template),此外解决了多重继承产生的二义性问题和相应的构造函数与析构函数的处理等。
发展
1998年C++标准(ISO/IEC14882 Standard for the C++ Programming Language)得到了国际标准化组织(ISO)和美国标准化协会(ANSI)的批准,标准C++语言及其标准库更体现了C++语言设计的初衷。
名字空间的概念、标准模板库(STL)中增加的标准容器类、通用算法类和字符串类型等使得C++语言更为实用。此后C++是具有国际标准的编程语言,该标准通常简称ANSI C++或ISO C++ 98标准,以后每5年视实际需要更新一次标准。
2003年通过了C++标准第二版(ISO/IEC 14882:2003):这个新版本是一次技术性修订,对第一版进行了整理——修订错误、减少多义性等,但没有改变语言特性。这个版本常被称为C++03。
2011年8月10日的国际投票确定C++ 0X为正式国际标准,被命名为C++ 11结束,并且所有国家都投出了赞成票。先前被临时命名为C++0x的新标准正式定名为ISO/IEC 14882:2011,简称ISO C++ 11标准。C++ 11标准将取代现行的C++标准C++98和C++03。
变化
c++11的新特征
右值引用,move语义
auto类型推导
以范围为基础的for循环
Lambda函数与表示式
显示虚函数重载override final关键字
空指针
标准库变更:线程支持/多元组/正则表达式/智能指针/包装引用
参考文献: