C语言诞生于20CD70s,经过演变和发展形成了C89(或C90)和C99这两个通用标准,后者由于出现较晚还未被所有编译器完全兼容。许多现代流行语言例如C++,Java,C#,Perl都是基于C语言并包含各自的特性发展起来的,学习C语言有助于我们更好地理解其他语言。
C语言特性
优缺点
- C语言是一种底层语言,提供了机器级概念的访问,例如对字节和地址
- C语言是一种小型语言,只提供了一个有限的特性集合,这是因为其在很大程度上依赖一个标准函数的库
- C语言的优点在于高效,可移植,功能强大,灵活,标准库,与Unix系统的集成
- C语言的缺点在于不容易及时发现错误,可能会难以理解和修改(这一点是面向过程开发语言的弊端)
使用原则
- 借助于IDE(集成开发环境)进行编译和调试,可有效显示错误信息
- 复用现有的代码库,提高开发效率,节省试错成本
- 采用一套切合实际的编码规范,避免“投机取巧”和极度复杂的代码
- 紧贴标准,若非必要,避免使用不属于C89和C99标准的特性和库函数
基本概念
C程序的执行过程
对于任何一个.c文件,要想转化成机器可以执行的形式,需要经过以下三个步骤:
- 预处理 预处理器(preprocessor)执行以#开头的指令,其功能类似于编辑器,为程序添加内容或修改内容
- 编译 编译器(compiler)把修改后的程序翻译成机器指令,即目标代码
- 链接 链接器(linker)把目标代码和其他所需的附加代码(包括程序中用到的库函数)进行整合,最终形成可执行程序
GCC编译器面向Linux平台,是最流行的C语言编译器之一。最初是GUN C compiler的缩写,新版的GCC能够编译多种语言写的程序,因此变为GUN Compiler Collection的简称。其优点在于免费获取,兼容多种操作系统,广泛用于商业开发。
1 | GCC编译器的安全检查选项 |
指令
通常我们把预处理器执行的命令叫做指令,即以字符#开头的代码,指令默认只占一行,其结尾没有其他符号标识,通常包括以下几种
- 宏定义(macro definition)
#define
用于定义函数中所用到的常量 - 包含程序
#include
用于引入C程序所需的头文件(.h文件)
函数
事实上C语言就是函数的集合,函数类似于其他编程语言中的例行程序(routine)和子例程(subroutine),是用来构建程序的构建块,分为以下两种:
- 程序员编写的函数
- C语言实现的一部分提供的函数,称为库函数
一个C程序可以包含多个函数,但是main
函数是不可或缺的,且只能有几个,作为程序的入口,执行时系统会自动调用main
函数
语句
语句是程序运行时执行的命令,包括以下几种
- 返回语句,例如
return 0;
- 函数调用语句(function call),例如
printf("hello world\n");
每一条完整的语句必须要以;作为结束标识符
注释
即文档说明,每一个程序都应该包含识别信息,即程序名,编写日期,作者,程序的用途以及其他相关信息,以便对程序进行更好的理解和阅读
1 | /* 单行注释内容 */ |
变量
变量是指C语言中的存储单元,每个变量必须有一个类型(type),用于表示所存储的数据种类,如整型、浮点型、字符型。
在使用变量之前必须对其进行声明,声明方式为类型名 变量名;
,如果几个变量类型相同,则可采取合并声明,声明方式为类型名 变量名1,变量名2,变量名3;
C语言的编码规范为先将函数中所需要使用的变量在函数开始统一声明,再在之后的语句中使用,而在C99和其他语言规范中多采用使用时才声明的方式。
声明过后通过要给变量赋值,也称为变量的初始化,赋值方式为变量名 = 常量;
,通常情况下我们要保证所赋值的类型和变量的类型要保持统一,混合类型赋值可能会不安全,其中在对float类型的变量进行赋值的时候需要在常量后添加小写字母f
标识符(indentifier)
用于对变量、函数、宏和其他实体进行命名,命名规则如下:
- 标识符只能含有字母、数字和
_
(下划线) - 必须以字母或
_
(下划线)作为开头
注意C语言是区分大小写的,在命名时尽可能的保持标识符的可分辨性
关键字(keyword)
对C编译器而言具有特殊意义,不能用来作为标识符
| | | | |
| :—: | :—: | :—: | :—: | :—: |
| auto | enum | restrict1 | unsigned |
| break | extern | return | void |
| case | float | short | volatile |
| const | goto | sizeof | _Bool1 |
| continue | if | static | _Complex1 |
| default | inline1 | struct | _Imaginary1 |
| do | int | switch | |
| double | long | typedef | |
| else | register | union | |
有角标1的关键字是C99新增的