C源程序的结构特点

  1. 一个C语言源程序可以由一个或多个源文件组成。
  2. 每个源文件可由一个或多个函数组成。
  3. 一个源程序不论由多少个文件组成,都有一个且只能有一个 main 函数。
  4. 源程序中可以有预处理命令,预处理命令通常应放在源文件或源程序的最前面。
  5. 每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
  6. 标识符,关键字之间必须至少加一个空格以示间隔。
  7. 一个说明或一个语句占一行。
  8. 用{} 括起来的部分,通常表示了程序的某一层次结构。
  9. 低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。

标识符

变量名、函数名、标号等统称为标识符。

关键字

关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。

运算符

分隔符

常量

注释符

数据类型

变量的定义可以包括三个方面:数据类型,存储类型和作用域。

所谓数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的。
在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。

基本数据类型:其值不可以再分解为其它类型。也就是说,基本数据类型是自我说明的。

构造数据类型:是根据已定义的一个或多个数据类型用构造的方法来定义的。一个构造类型的值可以分解成若干个成员。每个成员都是一个基本数据类型或又是一个构造类型。

指针类型:用来表示某个变量在内存储器中的地址。

空类型:有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为空类型

对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。其值不发生改变的量称为常量,其值可变的量称为变量。

符号常量:用标示符代表一个常量。符号常量在使用之前必须先定义,其一般形式为:#define 标识符 常量。#define 也是一条预处理命令,称为宏定义命令,把该标识符定义为其后的常量值。

C 语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句和空语句。

表达式语句:表达式语句由表达式加上分号组成。执行表达式语句就是计算表达式的值。

函数调用语句:由函数名、实际参数加上分号组成。执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。

控制语句:控制语句用于控制程序的流程, 以实现程序的各种结构方式。
C语言有九种控制语句。 可分成以下三类:

  1. 条件判断语句:if 语句、switch 语句;
  2. 循环执行语句:do while 语句、while 语句、for 语句;
  3. 转向语句:break 语句、goto 语句、continue 语句、return 语句。

复合语句:把多个语句用括号{}括起来组成的一个语句称复合语句。

空语句:只有分号组成的语句称为空语句。

赋值语句:赋值语句是由赋值表达式再加上分号构成的表达式语句。 变量=表达式;

关系运算符和表达式

关系运算符及其优先次序

C语言中提供了三种逻辑运算符:&&, ||!

与运算符&&和或运算符||均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。

条件运算符和条件表达式

条件运算符为?和:,是一个三目运算符,即有三个参与运算的量。

表达式 1? 表达式 2: 表达式 3

如果表达式 1 的值为真,则以表达式 2 的值作为条件表达式的值,否则以表达式 2 的值作为整个条件表达式的值。

switch语句

1
2
3
4
5
6
7
switch(表达式){
case 常量表达式 1: 语句 1;
case 常量表达式 2: 语句 2;

case 常量表达式 n: 语句 n;
default : 语句 n+1;
}

函数

C程序由函数组成,函数是C源程序的基本模块。

从函数定义的角度看,函数可分为库函数和用户定义函数两种。

C语言的函数兼有其它语言中的函数和过程两种功能,把函数分为有返回值函数和无返回值函数两种。

从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。

一个函数在它的函数体内调用自身称为递归调用。

局部变量和全局变量

局部变量:局部变量是在函数内作定义说明的,作用域仅限于函数内。

全局变量:它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。

static声明局部变量

C 语言允许将局部变量得值放在 CPU 中的寄存器中,这种变量叫“寄存器变量”,用关键字 register 作声明。

预处理命令

预处理是指在进行编译的第一遍扫描之前所作的工作。

宏定义:

无参宏定义

一般形式为:#define 标识符 字符串

#表示这是一条预处理命令。 define为宏定义命令。

带参宏定义

对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。

一般形式为:#define 宏名(形参表) 字符串。带参宏定义中,宏名和形参表之间不能有空格出现。

文件包含

一般形式为:#include "文件名"

文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。

条件编译

第一种形式:

1
2
3
4
5
#ifdef 标识符
程序段 1
#else
程序段 2
#endif

如果标识符已被 #define 命令定义过则对程序段 1 进行编译;否则对程序段 2 进行编译。

第二种形式:

1
2
3
4
5
#ifndef 标识符
程序段 1
#else
程序段 2
#endif

如果标识符未被#define 命令定义过则对程序段 1 进行编译,否则对程序段 2 进行编译。

指针


Reference:

  1. C语言程序设计(第四版).pdf