函数(function)是完成特定任务的独立程序代码单元。首先,使用函数可以省去编写重复代码的苦差。其次,即使程序只完成某项任务一次,也值得使用函数。因为函数让程序更加模块化,从而提高了程序代码的可读性,更方便后期修改、完善。
1.1 创建并使用简单函数这里我们创建一个在一行打印40个星号的函数,并在一个打印表头的程序中使用该函数。如程序清单9.1所示,该程序由mian和startbar组成。
#include#define NAME "GIGATHINK, INC." #define ADDRESS "101 Megabuck Plaza" #define PLACE "Megapolis, CA 94904" #define WIDTH 40 void starbar(void); int main(void){ starbar(); printf("%sn", NAME); printf("%sn", ADDRESS); printf("%sn", PLACE); starbar(); return 0; } void starbar(void){ int count; for (count = 1; count <= WIDTH; count++) putchar('*'); putchar('n'); }
该程序的输出如下:
**************************************** GIGATHINK, INC. 101 Megabuck Plaza Megapolis, CA 94904 ****************************************1.2 分析程序
使用该程序时注意以下几点:
- 程序在3处使用了starbar标识符:函数原型(function prototype)告诉编译器函数starbar的类型;函数调用(function call)表明在此处执行函数;函数定义(function definition)明确地制定了函数要做什么。
- 函数和变量不一样,有多种类型。任何程序在使用函数之前都要声明该函数的类型。因此,在main函数定义的前面出现了下面的ANSI C风格的函数原型:
void starbar(void)
圆括号表明starbar是一个函数名。第一个void是函数类型,void类型表明函数没有返回值。第二个void(在圆括号中)表明该函数不带参数。分号表明这是在声明函数,不是定义函数。也就是说,这行声明了程序将使用一个名为starbar,没有返回值,没有参数的函数,并告诉编译器在别处查找该函数的定义。对于不识别ANSI C风格原型的编译器,只需声明函数的类型,如下所示:
void starbar();
注意,一些老版本的编译器甚至连void都识别不了。如果使用这种编译器,就要把没有返回值的函数声明为int类型。当然,最好还是换一个新的编译器。 - 一般而言,函数原型指明了函数的返回值类型和函数接受的参数类型。这些信息称为该函数的签名(signature)。对于starbar函数而言,其签名是该函数没有返回值,没有参数。
- 程序把starbar原型置于main的前面,当然也可以放在main里面的声明变量处。
- 在main中,执行到下面的语句时调用了starbar函数:
starbar();
这是调用void类型函数的一种形式。当计算机执行到starbar();语句时,会找到该函数的定义并执行其中的内容。执行完starbar中的代码后,计算机返回主调函数(calling function)继续执行下一行(本例中,主调函数是mian),如图9.1所示
- 程序中starbar和main的定义形式相同。首先函数头包括函数类型、函数名和圆括号,接着是左花括号、变量声明、函数表达式语句,最后以右花括号(如图9.2)结束。
- main函数的右花括号包塑编译器该函数结束的位置,后面的starbar函数头告诉编译器starbar是一个函数。
- starbar函数中的变量count是局部变量(local variable)。我们可以在程序中的其他地方(包括main中)使用count,这不会引起名称冲突,它们是同名的不同变量。
程序9.2 lethead2.c
#include#include #define NAME "GIGATHINK, INC." #define ADDRESS "101 Megabuck Plaza" #define PLACE "Megapolis, CA 94904" #define WIDTH 40 #define SPACE ' ' void show_n_char(char ch, int num); int main(void){ int spaces; show_n_char('*', WIDTH); putchar('n'); show_n_char(SPACE, 12); printf("%sn", NAME); spaces = (WIDTH - strlen(ADDRESS)) / 2; show_n_char(SPACE, spaces); printf("%sn", ADDRESS); show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2); printf("%sn", PLACE); show_n_char('*', WIDTH); putchar('n'); return 0; } void show_n_char(char ch, int num) { int count; for (count = 1; count <= num; count++) putchar(ch); }



