首先执行主函数的第一个语句,调用格式输出函数输出提示信息。接着调用格式输入函数,等待用户输入数据。用户看到程序输出的提示信息,输入数据,输入的数据被格式输入函数所接受,并将输入数据译成内部形式后,存入变量X和y。接着执行赋值语句,求右瑞表达式的值。该表达式以x和y的值为实际参数,调用函数main()。对函数min()的调用发生时,系统先保留好控制的返回点。在执行被调用函数min()之前,先为函数的形式参数a和b分配存储单元,并以它们对应的实际参数表达式的植给它们赋初值。接着为函数内部的变量(称为局部变量)分配存储单元。之后才开始执行被调用函数体中的语句。执行完函数体的语句,或执行了return语句,函数准备返回。在返回之前先将形式参数和局部变量所占用的存储单元全部释放。函数返回时,将函数的返回值带回调用处,从原先保留的控制返回点,继续执行,将函数调用的返回值存于变量d,输出结果,结束程序。综上所述,函数调用时,系统要做许多辅助工作,函数调用时发生的数据传递最主要的是实际参数向形式参数传递数据和函数的返回值传递给调用处。为正确编写函数,实现函数调用所希望的要求,需正确了解以下几项内容:
(1)当函数执行return语句或执行完函数体的语句序列后,函数的这次调用就执行结束,随之将控制返回到函数调用处继续执行。
(2)函数的返回值是通过执行return语句时,计算return之后的表达式值而获得的。如果函数不提供返回值,则return语句不应包含表达式。
(3)如果函数有返回值,则应有确定的类型,并在函数定义时指明。同时,return语句的表达式类型应与函数定义中指明的返回值类型相一致。
(4)为了明确指明函数不提供返回值,建议在函数定义时,在函数名之前写上void。并在这样的函数体内,所有的return语句都不应该带表达式。
6.3 函数说明
C函数都是外部的,一般来说,任一函数都能被其它函数调用。而一个函数要调用另一个函数,应知道被调用函数的一些有关如何正确调用的信息。调用函数与被调用函数之间在程序正文中可能会存在以下几种情况。
(1)调用同一程序文件中前面已定义的函数。
(2)调用处于同一程序文件后面定义的函数。
(3)调用别的程序文件中定义的函数。
对于第一种情况,因在函数调用处,被调用函数的详细信息已被编译程序所接受,在函数定义之后调用前面已定义的函数,能方便地检查调用的正确性。对于后两种情况,这时因被调用函数的信息还未被编译程序所接受,不能检查函数调用的正确性,所以在调用之前需对被调用函数有关调用的一些信息作出说明。如函数的返回值类型、函数名和函数有关形式参数的个数及其类型等。这样的说明称作函数说明。函数说明的一般形式为
存储类型说明符 数据类型说明符 函数名(形式参数说明表);
其中存储类型说明符可以省缺,或写成extern。形式参数说明表可以为空,也可以顺序列出各形式参数的类型,同样也可以顺序列出各形式参数的类型和形式参数的名。
6.4 函数调用中的数据传递方式
函数调用时,调用处与被调用函数之间会有数据传递发生。在C程序中,函数调用的数据传递方式有四种:实际参数的数据值传递给形式参数(值传递方式)、实际参数的指针值传递给形式参数(地址传递方式)、函数以返回值传递给调用环境(返回值方式)、调用环境与被调用函数共用全局变量(全局变量传递方式)。在地址传递方式中,实际参数可以是传递一般变量的指针、数组某元素的指针、字符串某字符指针等。
1.实际参数向形式参数传递非指针数据
调用带形式参数的函数时,调用处将实际参数的值传递给被调用函数的形式参数。在此要特别说明以下几点:
(1)函数调用时实际参数为对应的形式参数提供初值,实际参数表达式的值是在执行函数体之前计算的,函数调用中的实际参数可以是常量、变量或是一般的表达式。