c 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 unix 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 c 语言。
c 语言是一种广泛使用的计算机语言,它与 java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。
当前最新的c语言标准为 c11 ,在它之前的c语言标准为 c99。
c 语言基础教程提供全面通俗易懂的教程,带你快速入门c 语言。在学习完c 语言基础教程后可以再学习极客笔记网提供的。
c语言起源
c语言最早的原型是 algol 60 1963 年,剑桥大学将其发展成为 cpl(combined programing language)。
1967 年,剑桥大学的 matin richards 对 cpl 语言进行了简化,产生了 bcpl 语言。
1970 年,美国贝尔实验室的 ken thompson 将 bcpl 进行了修改,并取名叫做 b 语言,意思是提取 cpl 的精华(boiling cpl down to its basic good features)。并用 b 语言写了第一个 unix 系统。
1973 年,at&t 贝尔实验室的 dennis ritchie(d.m.ritchie) 在 bcpl 和 b 语言的基础上设计出了一种新的语言,取 bcpl 中的第二个字母为名,这就是大名鼎鼎的 c 语言。随后不久,unix 的内核(kernel) 和应用程序全部用 c 语言改写,从此,c 语言成为 unix 环境下使用最广泛的主流编程语言。
c语言标准进化史
下图是c语言不同标准的差异和总结
c89
随着 c 语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的“无歧义、于具体平台无关的 c 语言定义” 成为越来越重要的事情。
1983 年,asc x3(ansi 属下专门负责信息技术标准化的机构,现已改名为 incits)成立了一个专门的技术委员会 j11(j11 是委员会编号,全称是 x3j11),负责起草关于 c 语言的标准草案。
1989 年,草案被 ansi 正式通过成为美国国家标准,被称为 c89 标准。
c90
随后, 《the c programming language》第二版开始出版发行,书中内容根据 ansi c(c89)进行了更新。
1990 年,在 iso/iec jtc1/sc22/wg14 (iso/iec 联合技术第 i 委员会第 22 分委员会第 14 工作组) 的努力下,iso 批准了 ansi c 成为国际标准。于是 iso c(又称为 c90) 诞生了。除了标准文档在印刷编排上的某些细节不同外,iso c(c90) 和 ansi c(c89) 在技术上完全一样。
c95
之后,iso 在 1994、1996 年 分别出版了 c90 的技术勘误文档,更正了一些印刷错误,并在1995 年通过了一份 c90 的技术补充,对 c90 进行了微小的扩充,经过扩充后的 iso c 被称为 c95。
c99
1999 年,ansi 和 iso 又通过了最新版本的 c 语言标准和技术勘误文档,该标准被称为 c99 。这基本上是目前关于 c 语言的最新、最权威的定义了。
c11
c11(也被称为c1x)指iso标准iso/iec 9899:2011,是当前最新的c语言标准。在它之前的c语言标准为c99。
c11新特性
- 对齐处理(alignment)的标准化(包括_alignas标志符,alignof运算符,aligned_alloc函数以及
头文件) - _noreturn 函数标记,类似于 gcc 的 attribute((noreturn))
- _generic 关键字
- 多线程(multithreading)支持,包括:
_thread_local存储类型标识符,头文件,里面包含了线程的创建和管理函数。
_atomic类型修饰符和头文件 - 增强的unicode的支持。基于c unicode技术报告iso/iec tr 19769:2004,增强了对unicode的支持。包括为utf-16/utf-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件
- 删除了 gets() 函数,使用一个新的更安全的函数gets_s()替代
- 增加了边界检查函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等
- 增加了更多浮点处理宏(宏)
- 匿名结构体/联合体支持。这个在gcc早已存在,c11将其引入标准
- 静态断言(static assertions),_static_assert(),在解释 #if 和 #error 之后被处理
- 新的 fopen() 模式,(“…x”)。类似 posix 中的 o_creat|o_excl,在文件锁中比较常用
- 新增 quick_exit() 函数作为第三种终止程序的方式。当 exit()失败时可以做最少的清理工作