C语言教程

2024年03月29日 C语言教程 极客笔记

C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

C 语言是一种广泛使用的计算机语言,它与 Java 编程语言一样普及,二者在现代软件程序员之间都得到广泛使用。

当前最新的C语言标准为 C11 ,在它之前的C语言标准为 C99。

C 语言基础教程提供全面通俗易懂的教程,带你快速入门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函数以及<stdalign.h>头文件)
  • _Noreturn 函数标记,类似于 gcc 的 attribute((noreturn))
  • _Generic 关键字
  • 多线程(Multithreading)支持,包括:
    _Thread_local存储类型标识符,<threads.h>头文件,里面包含了线程的创建和管理函数。
    _Atomic类型修饰符和<stdatomic.h>头文件
  • 增强的Unicode的支持。基于C Unicode技术报告ISO/IEC TR 19769:2004,增强了对Unicode的支持。包括为UTF-16/UTF-32编码增加了char16_t和char32_t数据类型,提供了包含unicode字符串转换函数的头文件<uchar.h>
  • 删除了 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()失败时可以做最少的清理工作

本文链接:http://so.lmcjl.com/news/645/

展开阅读全文