可以把函数看作“黑盒子”,即对一定的输入会产生特定的结果或返回某个数值,而黑盒子的内部行为并不需要考虑,除非是该函数的编写者(相对于函数的使用者)。例如,使用printf()函数时,只需向其传递一个控制字符串,或许还有其他一些参数,然后就可以预测到printf()的执行结果,而无需了解printf()的内部代码。以这种方式看待函数有助于把精力投入到程序整体设计而不是其实现细节。因此,编写函数代码之前首先需要考虑的是函数的功能以及函数和程序整体上的关系。
带有参数的函数
假设有如下函数原型: void my_func(int n); 上述函数原型表明my_func()接受一个int类型的参数。声明一个参数就创建了一个被称为形式参数的变量。本例中,形式参数是叫做n的int类型变量。像my_func(10)这样的函数调用会把10赋给n。称函数调用传递一个值,这个值被称为实际参数。因此,函数调用my_func(10)把实际参数10传递给函数,然后函数把10赋给形式参数n。 函数中的变量名字是局部的。这意味着在一个函数里定义的名字不会与其他地方相同的名字发生冲突。 如同函数内部定义的变量一样,形式参量是局部变量,它们是函数所私有的。 函数原型中可以省略变量名。在原型中使用变量名并没有实际地创建变量。
#include <stdio.h> int main(void) { const float MIN = 0.0f; const float MAX = 100.0f; float score; float total = 0.0f; int n = 0; float min = MAX; float max = MIN; printf("Enter the first score (q to quit): "); while (scanf("%f", &score) == 1) { // 筛选无效的分数 if (score < MIN || score > MAX) { printf("%0.1f is an invalid value. Try again: ", score); continue; // continue语句导致程序跳过循环其余的用于处理有效输入的部分 } printf("Accepting %0.1f:\n", score); min = (score < min) ? score: min; max = (score > max) ? score: max; total += score; n++; printf("Enter next score (q to quit): "); } if (n > 0) { printf("Average of %d scores is %0.1f.\n", n, total / n); printf("Low = %0.1f, high = %0.1f\n", min, max); } else printf("No valid scores were entered.\n"); return 0; }
