C语言基本程序结构

(括号数字是《从问题到程序》中的章节编号)




基本控制结构

这里列出 C 语言的各种控制结构,并给出简短的解释。


复合语句

在形式上是一对花括号,其中可以有一系列的定义或说明,后跟一系列的语句。这两部分都可以没有。(3.1


条件语句

if (表达式) 语句1

if (表达式) 语句1 else 语句2

“表达式”应当为算术类型或者指针类型。首先对“表达式”求值,若得到的值非0就执行“语句1”部分;若得到值0,在有else部分时执行“语句2”,否则整个条件语句立即结束。(3.6.1


当循环语句

while (表达式) 语句

“表达式”应当为算术或指针类型。首先对“表达式”求值,得到值0时整个循环语句立即结束;得到非0值时执行“语句”部分,然后重复这整个过程。(3.6.2


for循环语句:

for (初值表达式;条件表达式;步进表达式) 语句

首先求值“初值表达式”。然后顺序地反复做下面三步:求值“条件表达式”,执行“语句”,求值“步进表达式”。一旦条件表达式求值得到0,整个语句就立即结束。条件表达式必须是算术类型或指针类型的。(3.6.3


do-while循环语句:

do 语句 while (表达式);

首先执行“语句”,执行完毕后对“表达式”求值。当求出的值非0时重复前面的过程;否则整个语句结束。这里的“表达式”也必须是算术类型或指针类型。(4.3.1


开关语句:

switch (表达式) {case 常量: 语句序列 case 常量: 语句序列 ...}

这里“表达式”和“常量”可以是各种字符类型或整型。首先求“表达式”的值,然后用这个值与作为case标号的各常量匹配。如果发现匹配的标号,就从这个位置开始执行。一个switch语句中的标号不能有相同的值。语句中可以有一个default标号,其他标号都不匹配时执行转到default标号处。如果没有default标号,出现标号都不匹配的情况时语句立即结束。人们通常在每个序列的最后放一个break语句。(4.5


空语句

只包含一个分号。它的执行什么也不做,通常用于在程序中填补位置。(3.7.4


终止语句

break;

退出最内层的循环语句或者switch语句。(4.3.2


继续语句

continue;

停止最内层循环体的一次执行,准备开始循环的下次执行。(4.3.2


返回语句

return;

return 表达式;

立即结束当前函数的执行,控制返回函数调用处。第一种形式用于无返回值的函数,第二种形式用于有返回值的函数。第二种形式在执行时表达式被求值,得到的值转换成函数所要求的返回值类型,作为函数的返回值。(3.3.13.2.35.2.4


转跳语句

goto 标号;

使程序执行立即转到指定标号处。标号的作用域是当前函数体。(4.3.2

标号的形式是标识符后跟一个冒号。

注:程序设计实践告诉我们,应当尽量采用结构化的控制语句,不使用转跳语句。





变量的定义与说明

  简单变量的定义及初始化问题见(3.2.13.2.35.3.5),数组变量定义及初始化描述问题见(6.1.16.1.2),指针变量的有关问题见(7.1)。结构变量、联合变量的有关问题见(8.1.18.3等)。

  各种变量有关情况请参看:自动变量(3.2.15.3.25.3.3),寄存器变量(5.3.5),外部变量(5.3.15.3.25.3.5),局部静态变量(5.3.4),外部静态变量(5.3.5),常变量(5.3.5)。

  有关变量的外部说明的形式及作用参看(5.3.1)。




数组、结构、联合、枚举的描述和类型说明

  数据描述机制:数组(6.1.16.5)、结构(8.1.1)、联合(8.3)、枚举(8.4)。

  类型定义的有关问题见(7.6),复杂类型的描述和解读见(7.8)。




函数定义、调用和原型说明

  函数定义的基本形式是:

    返回值类型 函数名参数表 函数体

其中函数名是一个标识符;函数体是一个复合语句;参数表由一对圆括号界定,括起一系列参数描述,每个描述说明了函数一个形式参数的名字和它的类型。参数描述间用逗号分隔。无参函数的参数表可以写为()(void)。(3.33.55.2

  函数调用是一种基本表达式,形式是:

    函数名 实际参数表

其中实际参数表由一对圆括号界定,里面是一系列的实际参数表达式,表达式间用逗号分隔。无参函数的调用形式是函数名之后跟一对空的圆括号。(3.33.55.3

  函数原型的书写形式是:

    返回值类型 函数名参数表;

参数表的形式与函数定义类似,其无参函数的参数表(void)。意义和作用请参看(5.2.65.2.75.2.88.6)。请注意:为了保证编译程序对函数定义与调用间的一致性进行检查(防止由不一致引起的错误),函数原型中应该给出完整的参数类型描述,但参数的名字可以忽略不写。