C - 无需运行环境支持 编译型跨平台高级计算机编程语言
C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易方式编译、处理低级存储器、产生少量机器码及无需任何运行环境支持便能运行的编程语言。
尽管 C 语言提供了许多低级处理功能,但仍保持着良好的跨平台特性,以 C 语言编写的程序可在许多电脑系统平台上编译,甚至包括嵌入式处理器(单片机或称 MCU)及超级电脑等作业平台。
C 语言之所以命名为 C,是因为 C 语言源自 Ken Thompson 发明的 B 语言,而 B 语言则源自 BCPL 语言。
1967 年剑桥大学的 Martin Richards 对 CPL 语言进行了简化,于是产生了 BCPL(Basic Combined Programming Language)语言。
20 世纪 60 年代美国 AT&T 公司贝尔实验室(AT&T Bell Laboratory)的研究员 Ken Thompson 闲来无事,手痒难耐,想玩一个他自己编写的模拟太阳系航行的电子游戏 —— Space Travel。他背着老板,找到了一台空闲机器 —— PDP-7。但这台机器并没有操作系统,而游戏必须使用操作系统的一些功能,于是他着手为 PDP-7 开发操作系统。后来,这个操作系统被命名为 —— UNIX。
1970年美国贝尔实验室的 Ken Thompson 以 BCPL 语言为基础,设计出简单且很接近硬件的 B 语言(取 BCPL 的首字母)。并用 B 语言写了第一个 UNIX 操作系统。
1971 年同样酷爱 Space Travel 游戏的 Dennis M. Ritchie 为能早点玩上游戏,加入了 Thompson 的开发项目,合作开发 UNIX。他的主要工作是改造 B 语言,使其更成熟。
1972 年美国贝尔实验室的 Dennis M. Ritchie,在 B 语言的基础上设计出了一种新语言,取 BCPL 的第二个字母作为这种语言的名字,这就是 C 语言。
10 倍以上效率提升 智能GUI文档翻译 Python Qt/C++ HTML5 网站站群 "数字 IDE 专业版" 开发工具 http://idepro.digitser.cn/ http://forum.digitser.cn/thread-2184-1-1.html
百度网盘 https://pan.baidu.com/s/1jIzOgzs
软件仓库 https://github.com/digitser https://digitser.sourceforge.io/ https://pan.baidu.com/s/1TV70__Be1ta0ney1-tudFQ
1973 年初 C 语言的主体完成。Ken Thompson 和 Dennis M. Ritchie 迫不及待地用它完全重写了 UNIX。此时,编程的乐趣使他们已完全忘记了那个 "Space Travel" 游戏,一门心思投入到了 UNIX 和 C 语言的开发中。随着 UNIX 的发展,C 语言自身也在不断完善。直到今天,各种版本的 UNIX 内核和周边工具仍使用 C 语言作为最主要的开发语言,其中还有不少继承了 Ken Thompson 和 Dennis M. Ritchie 的代码。
在开发中,Ken Thompson 和 Dennis M. Ritchie 还考虑把 UNIX 移植到其他类型的计算机上使用。C 语言强大的移植性(Portability)在此显现。机器语言和汇编语言都不具有移植性,为 x86 开发的程序,不可能在 Alpha、SPARC 及 ARM 等机器上运行。而 C 语言程序则可用在任意架构的处理器上,只要那种架构的处理器具有对应的 C 语言编译器和库,然后,将 C 源代码编译、连接成目标二进制文件之后即可运行。
1977 年Dennis M. Ritchie 发表了不依赖于具体机器系统的 C 语言编译文本《可移植的 C 语言编译程序》。
1982 年很多有识之士和美国国家标准协会为使这种语言健康地发展下去,决定成立 C 标准委员会,建立 C 语言标准。委员会由硬件厂商、编译器及其他软件工具生产商、软件设计师、IT 顾问、学术界人士、C 语言作者及应用程序员组成。
1989 年 ANSI 发布了第一个完整的 C 语言标准 —— ANSI X3.159 — 1989,简称 “C89”,不过人们也习惯称其为 “ANSI C”。
1990 年 C89 在被国际标准组织 ISO (International Organization for Standardization) 一字不改地采纳,ISO 官方给予的名称为:ISO/IEC 9899,所以 ISO/IEC 9899: 1990 也通常被简称为 “C90”。
1999 年在做了一些必要的修正和完善后,ISO 发布了新的 C 语言标准,命名为ISO/IEC 9899:1999,简称 “C99”。
2011 年 12 月 8 日 ISO 又正式发布了新标准,称为 ISO/IEC 9899: 2011,简称为 “C11”。
C 语言程序基本构成与注意事项: 01、一个 C 语言源程序可由一个或多个源文件组成;
02、每个源文件可由一个或多个函数组成;
03、一个源程序不论由多少个文件组成,都有一个且只能有一个为整个程序入口的 main 函数,即主函数;
04、源程序中可以有预处理命令(包括:include,ifdef、ifndef、define),预处理命令通常应放在源文件或源程序的最前面;
05、每一个说明,每一个语句都必须以分号结尾;但预处理命令、函数头及花括号 “}” 之后不能加分号。结构体、联合体、枚举型声明的 “}” 后要加“ ;”;
06、标识符、关键字之间必须至少加一个空格以示间隔;若已有明显间隔符的,也可不再加空格间隔。
C 语言书写规则:
01、一个说明或一条语句占一行;
02、用 {} 括起来的部分,通常表示程序的某一层次结构;{} 一般与该结构语句的第一个字母对齐,并单独占一行;
03、低一层次的语句或说明可比高一层次的语句或说明,缩进若干格后书写;以便看起来更清晰,增加程序的可读性。
在编程时应力求遵循这些规则,以养成良好的编程风格。
以下是会在标准输出 (stdout) ,打印 "Hello, world!" 字符串的简单 C 语言程序代码:
- # include <stdio.h>
- int main(void)
- {
- printf("Hello, Word!\n");
- return 0;
- }
复制代码
基本特性
01、高级语言
C 语言把高级语言的基本结构和语句,与低级语言的实用性结合了起来。
02、结构化
结构式语言的显著特点是:代码及数据的分离,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
03、跨平台
由于标准的存在,使得几乎同样的C 代码可用于多种操作系统,如 Windows、DOS、UNIX 等等;也适用于多种机型。C 语言对编写需要操控硬件的场合,优于其它高级语言。
04、指针
可直接进行靠近硬件的操作,但 C 指针操作不做保护,也给它带来了很多的不安全影响。
C++在这方面做了改进,在保留指针操作的同时又增强了安全性,受到了一些用户的支持,但由于这些改进增加了语言的复杂度,也为另一部分用户所诟病。
Java 则吸取了 C++ 的教训,取消了指针操作,也取消了 C++ 改进中一些备受争议的地方,在安全性和适用性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于 C/C++。
一般而言,C、C++、java 被视为同一系语言,它们长期占据着程序使用榜的前三名。
此外,C 语言还是一种具有变量作用域(variable scope)及递归功能的过程语言;不同的变量类型可以用结构体(struct)组合在一起。C 语言只有 32 个保留字(reserved keywords),使变量、函数命名有更多弹性。部分变量类型可以转换,譬如:整型和字符型变量。
C 语言传递参数均是以值传递(pass by value),也可采用指针(a pointer passed by value)传递。通过指针(pointer),C 语言可轻松对存储器进行低级控制。
C语言的预编译处理(preprocessor),可让编译更具有弹性。
优点
01、简洁紧凑、灵活方便
C 语言一共只有32 个关键字,9 种控制语句,程序书写形式自由,区分大小写。
C 语言把高级语言的基本结构和语句,与低级语言的实用性结合了起来。
C 语言可像汇编语言一样对位、字节及地址进行操作,而这三者是计算机最基本的工作单元。
02、运算符丰富 C语言运算符范围广泛,共有 34 种运算符。
C 语言把括号、赋值、强制类型转换等都作为运算符处理。从而使 C 语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符,可实现在其它高级语言中难以实现的运算。
03、数据类型丰富 C 语言数据类型,有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。可用来实现各种复杂数据结构的运算。C 语言引入了指针概念,使程序效率更高。
04、表达方式灵活实用 C 语言提供了多种运算符和表达式值方法,对问题的表达可通过多种途径获得,程序设计主动、灵活。C 语言语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据,可以通用等。
05、允许直接访问物理地址,对硬件进行操作
由于 C 语言允许直接访问物理地址,可以直接对硬件进行操作;因此,它既具有高级语言的功能,又具有低级语言的许多特性。可像汇编语言一样对位(bit)、字节及地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
06、生成目标代码质量高,程序执行效率高 C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C 语言一般仅比汇编程序生成的目标代码效率低 10%~20%。
07、可移植性好 C语言在不同机器上的编译程序,86% 的代码是公共的;所以,C 语言编译程序便于移植。在一个环境上用 C 语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境下运行。
08、表达力强 C语言有丰富的数据结构和运算符。包含各种数据结构,譬如:整型、数组类型、指针类型和联合类型等,可用来实现各种数据结构的运算。C 语言的运算符有 34 种,范围很宽,灵活使用各种运算符可实现难度极大的运算。C 语言能直接访问硬件的物理地址,能进行位(bit)操作。兼有高级语言和低级语言的许多优点。
C语言既可用来编写系统软件,又可开发应用软件,已成为一种通用程序设计语言。
此外,C 语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
缺点
01、C 语言的在数据的封装性上,这一点使得 C 语言在数据的安全性上有很大缺陷,这也是 C 和 C++ 的一大区别。
02、C 语言的语法限制不太严格,对变量的类型约束也不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C 语言比其他高级语言较难掌握。也就是说,对用 C 语言的人而言,要求对程序设计更熟练一些。
基本构成
01、数据类型
C 语言的数据类型,包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
02、常量与变量 常量其值不可改变,符号常量名通常用大写。
变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时会为其分配相应存储单元。
03、数组 如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。要特别注意的是,方括内的索引值是从 0 算起的。
字符串也是一种数组。它们以 ASCII 的 NULL 作为数组的结束。
04、指针
指针是 C 语言区别于,其他同时代高级语言的主要特征之一。指针是一把双刃剑,许多操作可通过指针自然的表达,但是不正确或过分使用指针又会给程序带来大量潜在的错误。
如一个变量声明时,前面使用 * 号,表明这是个指针型变量。换句话说,该变量存储一个地址,而 *(此处特指单目运算符 * ,下同。C 语言中另有双目运算符 *) 则是取内容操作符,意思是取这个内存地址里存储的内容。
指针不仅可以是变量地址,还可以是数组、数组元素、函数地址。通过把指针作为形式参数,可在函数调用过程得到一个以上的返回值,不同于 return(z)这样仅能得到一个返回值。
05、字符串
C 语言的字符串,其实就是以 '\0' 字符结尾的 char 型数组。
C 语言使用字符型并不需要引用库,但使用字符串就需要 C 标准库里面的一些用于对字符串进行操作的函数。它们不同于字符数组。使用这些函数需要引用头文件 <string.h>。
06、文件 输入/输出
在 C 语言中,输入和输出是经由标准库中的一组函数来实现的。在 ANSI C 中,这些函数被定义在头文件 <stdio.h>;中。
有三个标准输入/输出是标准 I/O 库预先定义的:stdin 标准输入、stdout 标准输出、stderr 输入输出错误。
07、运算
C 语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。
在表达式方面较其它程序语言更为简洁,譬如:自加、自减、逗号运算和三目运算使表达式更为简单;但初学者往往会觉得这种表达式难读,关键原因是对运算符和运算顺序理解不透不全。
当多种不同运算组成一个运算表达式,即:一个运算式中出现多种运算符时,运算的优先顺序和结合规则就显得十分重要。
在学习中,对此合理进行分类,找出它们与数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更要牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
C 语言运算符按优先程度不同,可分为 15 种优先级,从高到低,优先级为1 ~ 15,除第 2、3 级和第 14 级为从右至左结合外,其它都是从左至右结合,决定同级运算符的运算顺序。
关键字
关键字又称为保留字,就是已被 C 语言本身占用,不能作其它用途使用的字。譬如:关键字不能用作变量名、函数名等标识符。ISO 标准定义的 C 语言关键字:
void char int double _Bool _Complex _Imaginary _Generic
short long (long long) signed unsigned restrict
struct union enum typedef sizeof inline
auto static register extern const volatile
return continue break goto
if else switch case default
01、基本数据类型关键字 void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89 标准新增)
char:字符型类型数据,属于整型数据的一种。(K&R 时期引入)
int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R 时期引入)
float:单精度浮点型数据,属于浮点数据的一种。(K&R 时期引入)
double:双精度浮点型数据,属于浮点数据的一种。(K&R 时期引入)
_Bool:布尔型(C99 标准新增)
_Complex:复数的基本类型(C99 标准新增)
_Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99 标准新增)
_Generic:提供重载的接口入口(C11 标准新增)
02、类型修饰关键字 short:修饰int,短整型数据,可省略被修饰的int。(K&R 时期引入)
long:修饰int,长整型数据,可省略被修饰的int。(K&R 时期引入)
long long:修饰int,超长整型数据,可省略被修饰的int。(C99 标准新增)
signed:修饰整型数据,有符号数据类型。(C89 标准新增)
unsigned:修饰整型数据,无符号数据类型。(K&R 时期引入)
restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。(C99 标准新增)
03、复杂类型关键字 struct:结构体声明。(K&R 时期引入)
union:联合体声明。(K&R 时期引入)
enum:枚举声明。(C89 标准新增)
typedef:声明类型别名。(K&R 时期引入)
sizeof:得到特定类型或特定类型变量的大小。(K&R 时期引入)
inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99 标准新增)
04、存储级别关键字 auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R 时期引入)
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R 时期引入)
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R 时期引入)
extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R 时期引入)
const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89 标准新增)
volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89 标准新增)
05、跳转结构 流程控制关键字
return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。(K&R 时期引入)
continue:结束当前循环,开始下一轮循环。(K&R 时期引入)
break:跳出当前循环或 switch 结构。(K&R 时期引入)
goto:无条件跳转语句。(K&R 时期引入)
06、分支结构 流程控制关键字 if:条件语句,后面不需要放分号。(K&R 时期引入)
else:条件语句否定分支(与if连用)。(K&R 时期引入)
switch:开关语句(多重分支语句)。(K&R 时期引入)
case:开关语句中的分支标记,与 switch 连用。(K&R 时期引入)
default:开关语句中的 “其他” 分支,可选。(K&R 时期引入)
函数
C 语言程序是由一组变量或是函数的外部对象组成的。
C 语言函数是一个自我包含的完成一定相关功能的执行代码段。函数提供了编制 C 语言程序的手段,使之容易读、写、理解、排除错误、修改和维护。我们可把函数看成一个 “黑盒子”,只要将数据送进去就能得到结果,而函数内部究竟是如何工作的,外部程序是不知道的。外部程序所知道的仅限于输入给函数什么以及函数输出什么。
C 语言程序中函数的数目实际上是不限的,如果说有什么限制的话,那就是,一个 C 程序中必须至少有一个函数,且其中必须有一个且仅有一个以 main 为名的主函数,整个程序从这个主函数开始执行。
C 语言程序鼓励和提倡人们把一个大问题划分成一个个子问题,对应于解决一个子问题编制一个函数;因此,C 语言程序一般是由大量的小函数而不是由少量大函数构成的,即所谓 “小函数构成大程序”。这样的好处是:让各部分相互充分独立,并且任务单一。因而,这些充分独立的小模块也可作为一种固定规格的小 “构件”, 用来构成新的大程序。
函数库
C 语言发展了那么多年来,用 C 语言开发的系统和程序浩如烟海。在发展的同时也积累了很多可直接使用的库函数。
ANSI C 提供了标准 C 语言库函数。
C 语言初学者比较喜欢 Turbo C 2.0 提供的 400多个运行时函数,每个函数可都完成特定功能,用户可随意调用。这些函数总体可分成:输入输出函数、数学函数、字符串和内存函数、与 BIOS 和 DOS 有关的函数、 字符屏幕和图形功能函数、过程控制函数、目录函数等。
Windows 系统提供的 Windows SDK 中包含了数千个跟 Windows 应用程序开发相关的函数。
其他操作系统,譬如:Linux,也同样提供了大量函数让应用程序开发人员调用。
作为程序员应尽量熟悉目标平台库函数其功能。这样才能游刃有余地开发特定平台的应用程序。譬如:作为 Windows 应用程序的开发者,应尽量熟悉 Windows SDK;作为 Linux 应用程序开发者,应尽量熟悉 Linux 系统调用和 POSIX 函数规范。
运算符
C 语言比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补 0)位移。例如,将 11100011 右移 3 比特,算术右移后成为 11111100,逻辑右移则为 00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。
C 语言运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。
# | 运算符 | 作用 | 备注
| 01
| ()、 []、 -> 、 .、!、 ++、 -- | 圆括号、方括号、指针、成员、逻辑非、自加、自减 |
| 02
| ++ 、 -- 、 * 、 & 、 ~ 、! | 单目运算符 |
| +、 - 、 sizeof、(cast) |
| 03
| * 、 / 、% | 算术运算符 |
| 04
| + 、 - | 算术运算符 |
| 05
| << 、 >> | 位运算符 |
| 06
| < 、 <= 、 > 、 >= | 关系运算符 |
| 07
| == 、!= | 关系运算符号 |
| 08
| & | 位与 |
| 09
| ^ | 位异或 |
| 10
| | | 位或 |
| 11
| && | 逻辑与 |
| 12
| || | 逻辑或 |
| 13
| ? 、: | 条件运算符 |
| 14
| /= 、%= 、 &= 、 |= 、 ^= | 赋值运算符 |
| = 、 += 、 -= 、 *= 、 |
| 15
| , | 顺序运算符 |
|
版本历史
时间 | 版本 | 事件 | 备注 | 1978 年 | K&R C | 起初,C 语言并没有官方标准
1978 年美国电话电报公司 AT&T 贝尔实验室正式发表 C 语言
布莱恩·柯林汉 Brian Kernighan 和丹尼斯·里奇 Dennis Ritchie 出书 "The C Programming Language"
这本书被 C 语言开发者们称为 K&R,很多年来被当作 C 语言的非正式标准说明;
人们称这个版本的 C 语言为 K&R C
| 把运算符 =+ 和 =- 改为 += 和 -=;
因为,=+ 和 =- 会使编译器不知道使用者要处理 i = -10 还是 i =- 10,产生混淆。
| 1970 年到 80 年代 | ANSI C / C89 | C 语言被广泛应用,从大型主机到小型微机,也衍生了很多不同版本 | | 1983 年 | 美国国家标准协会(ANSI)成立了一个 X3J11 委员会,制定 C 语言标准 | | 1989 年 | ANSI 通过 C 语言标准,称为 ANSI X3.159-1989 "Programming Language C";
| 简称 C89 标准,也简称 ANSI C
因为,这个标准是美国国家标准协会(ANSI)发布的。 | 1990 年 | ISO 和国际电工委员会 IEC 把 C89 标准定为 C 语言国际标准
名为 ISO/IEC 9899:1990 - Programming languages -- C | 简称 C90 标准
不过,大多数人依然称之为 C89 标准,因为此标准与 ANSI C89 标准完全等同。 | 1994 年 | ISO 和国际电工委员会 IEC 发布了 C89 标准修订版
名叫 ISO/IEC 9899:1990/Cor 1:1994 | 简称 C94 标准 | 1995 年 | ISO 和国际电工委员会 IEC 再次发布了 C89 标准修订版
名叫 ISO/IEC 9899:1990/Amd 1:1995 - C Integrity | 简称 C95 标准 | 1999 年
| C99 | ISO 和国际电工委员会 IEC 发布 C 语言新标准
名叫 ISO/IEC 9899:1999 - Programming languages -- C | 简称 C99 标准,这是 C 语言的第二个官方标准
增加了对编译器的限制
譬如:源程序每行要求至少支持到 4095 字节,变量名、函数名要求支持到 63 字节(extern 要求支持到 31);
支持 // 开头的单行注释(这个特性实际上在 C89 的很多编译器上已经被支持了);
格式化字符串中,利用 \u 支持 unicode 字符;
修改了 /% 处理负数时的定义,这样可以给出明确的结果
譬如:在 C89 中 -22 / 7 = -3, -22% 7 = -1,也可以 -22 / 7= -4, -22% 7 = 6
而 C99 中明确为 -22 / 7 = -3, -22% 7 = -1,只有一种结果;
取消了函数返回类型默认为 int 的规定
增加和修改了一些标准头文件,譬如:定义 bool 的 <stdbool.h>
定义一些标准长度的 int 的 <inttypes.h> ,定义复数的 <complex.h>
定义宽字符的 <wctype.h> ,类似于泛型的数学函数 <tgmath.h>, 浮点数相关的 <fenv.h>。
在 <stdarg.h> 增加了 va_copy 用于复制 ... 的参数。里增加了 struct tmx ,对 struct tm 做了扩展;
输入输出对宽字符以及长整数等做了相应的支持; | 2001 年 | ISO 和国际电工委员会 IEC 发布了 C99 标准修订版
名叫 ISO/IEC 9899:1999/Cor 1:2001 | 简称 C01 标准 | 2004 年 | ISO 和国际电工委员会 IEC 发布了 C99 标准修订版
名叫 ISO/IEC 9899:1999/Cor 2:2004 | 简称 C04 标准 | 2007 年 | ISO 和国际电工委员会 IEC 发布了 C99 标准修订版
名叫 ISO/IEC 9899:1999/Cor 3:2007 | 简称 C07 标准 | 2011 年
| C11 | ISO 和国际电工委员会 IEC 发布 C 语言新标准
名叫 ISO/IEC 9899:2011 - Information technology -- Programming languages -- C | 简称 C11 标准,原名 C1X,这是 C 语言的第三个官方标准,也是 C 语言的最新标准
新标准提高了对 C++ 的兼容性,并增加了一些新特性;
对齐处理 (Alignment) 的标准化
包括 _Alignas 标志符,alignof 运算符, aligned_alloc 函数以及 <stdalign.h> 头文件;
多线程 (Multithreading) 支持;
基于 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() 失败时可以做最少的清理工作; | 2012 年 | ISO 和国际电工委员会(IEC)发布了 C11 标准修订版
名叫 ISO/IEC 9899:2011/Cor 1:2012 | 简称 C12 标准 | | | | | | | | |
![](http://forum.digitser.cn/data/attachment/forum/201605/19/132155fevczeyds5e5y1wy.jpg) "长按二维码" 或 "扫一扫" 关注 "德云社区" 微信公众号
版权声明:
本文为独家原创稿件,版权归 德云社区,未经许可不得转载;否则,将追究其法律责任。
|