技术背景
C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发,尤其是单片机与嵌入式的开发。更多详情
C语言的使用过程中经常会看到GNU C、ANSI C和标准C几种说法,其中GNU C是软件自由基金会制定的标准,ANSI C是由美国国家标准学会制定的标准,而ISO C则是由国际标准化组织制定的标准,我们常说的标准C其实就是ISO C,大约在90年代,美国国家标准学会与国际标准化组织相互接纳吸收对方的标准,所以当前标准C与ANSI C的标准其实是一样的。而GNU C主要应用于linux内核开发,比标准C支持更多的特性,所以标准C = ISO C = ANSI C ≠ GNU C。
标准C主要有3个版本,C89(C90),C99和C11。具体区别如下图所示:
C90 标准
由于C语言被各大公司所使用(包括当时处于鼎盛时期的IBM PC),因此到了1989年,C语言由美国国家标准协会(ANSI)进行了标准化,此时C语言又被称为ANSI C。而仅过一年,ANSI C就被国际标准化组织ISO给采纳了。此时,C语言在 ISO 中有了一个官方名称——ISO/IEC 9899: 1990。
其中:9899是C语言在 ISO 标准中的代号,像C++在ISO标准中的代号是14882;而冒号后面的1990表示当前修订好的版本是在1990年发布的。
对于ISO/IEC 9899:1990的俗称或简称,有些地方称为C89,有些地方称为C90,或者C89/90。不管怎么称呼,它们都指代这个最初的C语言国际标准。
这个版本的C语言标准作为 K&R C的一个超集(即 K&R C是此标准C的一个子集),把后来引入的许多非官方特性也一起整合了进去。其中包括了从C++ 借鉴的函数原型(Function Prototypes),指向void的指针,对国际字符集以及本地语言环境的支持。
在此标准中,尽管已经将函数定义的方式改为现在我们常用的那种方式,不过K&R的语法形式仍然兼容。
C99标准
在随后的几年里,C语言的标准化委员会又不断地对C语言进行改进,到了1999年,正式发布了ISO/IEC 9899: 1999,简称为C99标准。
C99 标准引入了许多特性,包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。
毫不夸张地说,即便到目前为止,很少有C语言编译器是完整支持 C99 的。像主流的 GCC 以及 Clang 编译器都能支持高达90%以上,而微软的 Visual Studio 2015 中的C编译器只能支持到 70% 左右。
C11标准
2007 年,C语言标准委员会又重新开始修订C语言,到了 2011 年正式发布了 ISO/IEC 9899: 2011,简称为 C11 标准。
C11标准新引入的特征尽管没 C99 相对 C90 引入的那么多,但是这些也都十分有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持。
开发环境
Dev C++
笔者使用的是Dev C++ 5.11,需要注意的是编译器有时候会提示你的代码不满足某个标准所以编译不了。例如想让编译器支持C11标准,需要手动设置,在“工具->编译器选项->编译时加入以下命令”中加入“-std=c++11”即可。详情请参考
如果不想每次新建一个文件的时候都重复的输入头文件和main函数,这个时候可以使用模版文件,依次选择“工具->编译器选项->代码->缺省源”,在其中输入你需要的内容,勾选上“向项目源文件插入代码”,这样每次新建文件时就不用重复输入了。
Visual Studio
笔者用的是VS2019,通过“新建C++空项目->添加新项->手工把文件后缀名改成 .c”即可。详情请参考
推荐写练习代码的时候使用Dev C++,因为可以快速编译多个不同的代码文件看到结果;而构建复杂项目的时候使用Visual Studio,智能提示和代码补全都很全面,唯一的不足就是一个项目中只能有一个main入口,不方便快速编写多个练习代码。
学习过程
电子书:
中国大学MOOC(慕课)视频教程:
参考资料
结束语
超级个体,自带信息,不装系统,随时插拔,自由协作。
你自己就是一个“工作室”,老板不过是你最大的客户,而你们结账的方式就是一张工资卡。