函数
大多数编程语言都支持定义某种形式的函数。使用函数可以将一个大程序分解为小的代码块并分别命名,然后这些命名的代码块就可以在整个程序中重复使用了。函数输入参数并返回一个结果。C函数可以输入的参数个数没有限制。一般来说,对于编译器而言,只要在调用函数以前事先声明函数名称,则各函数在程序中的顺序并不重要。
我们已经讨论过一些有关函数的内容了。前面遇到的rand函数几乎是最简单的函数了。它不接受参数并返回一个整数:
int rand()
/* 摘自 KR
- 生成一个0-32767之间的随机数字。*/
rand_seed = rand_seed * 1103515245 +12345;return (unsigned int)(rand_seed / 65536) % 32768;
int rand()这些程序定义了rand函数,还指明rand没有输入参数并返回一个整数。此函数没有局部变量,但如果需要的话,局部变量会紧接着打开的开始。(C 允许您在任何 后面声明变量,这些变量一直存在,直到程序执行至那个匹配的 为止,此后即不复存在。因此函数的局部变量在遇到函数中匹配的 时就消失了。在其生存周期内,局部变量被保存在系统栈上。)请注意第一行的()后面没有;。您若不小心加上了分号,编译器会给出一大堆莫名其妙的错误信息。另外还要注意即使当函数没有参数时也要使用()。括号告诉编译器您在声明一个函数而不是简单地声明一个int类型。
对于任何要返回结果的函数来说,return语句是不可或缺的。它指明函数要返回的值并使函数立即退出。因此您可以在函数中放置多个return语句作为函数的多个退出点。若函数中没有return语句,则函数在执行到 时退出并返回一个随机值(这时很多编译器会发出警告)。C中的函数可以返回任何类型的值:包括int、float、char、结构体等等。
调用rand函数的方式有许多种。例如:x=rand();。此语句中x被赋值为rand的返回值。注意,在函数调用中即使没有参数也必须使用(),否则x将被赋值为rand函数的内存地址,而这通常并非您的本意。
也可以用这种方式调用rand:
if (rand() > 100)
或:
rand();
后一种方式中,rand函数被调用了,可是其返回值随即被丢弃。您可能不会以这种方式使用rand,但很多函数会返回某种错误代码作为调用结果,而您又不关心这些错误代码的话(如您知道不可能发生错误),就可以用这种调用方式将其丢弃。
如果您不想返回任何值的话,函数可以使用void作为返回类型。例如:
void print_header()
printf("第一个程序\n");printf("作者 Marshall Brain\n");
printf("版本 1.0, 发布于1991年12月26日\n");
此函数没有返回值。可以像下面这样调用:
print_header();
调用时必须加上(),否则函数不会被调用,即使此语句在很多系统上能通过编译。
C函数可以接受任何类型的参数。例如:
fact(int i)
int j,k;j=1;for (k=2; k=i; k++)
j=j*k;return j;
返回传入的整型参数i的阶乘。用逗号分隔多个参数:
int add (int i, int j)
return i+j;
C语言经历了许多年的演变。有时您会看到用“旧式风格”编写的函数。以add为例:
int add(i,j)
int i;int j;return i+j;
您应该能够读懂旧式代码。它们在执行上并无不同,只不过是另一种书写格式罢了。编写程序时应该使用“新式风格”(称为ANSI C),把类型声明写在参数列表中;除非您要把代码交付给只有“旧式”(非ANSI C)编译器的人。