1
C语言程序设计
1.7.1.2 6.1.2 函数调用

6.1.2 函数调用

1.函数调用的形式

函数调用的一般形式前面已经用过,在程序中是通过对函数的调用来执行函数体的,其过程与其他语言的子程序调用相似。C语言中,函数调用的一般形式为:

  函数名(实际参数表);

对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其他构造类型数据及表达式。各实参之间用逗号分隔。

在C语言中,可以用以下几种方式调用函数:

(1)函数表达式

函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数是有返回值的。例如:

  z=min(x,y);

是一个赋值表达式,把min的返回值赋予变量z。

(2)函数语句

函数调用的一般形式加上分号即构成函数语句。例如:

img504

都是以函数语句的方式调用函数。

(3)函数实参

函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的,例如:

  printf("%d",m in(x,y));

即是把min调用的返回值又作为printf函数的实参来使用的。

在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。Turbo C规定是自右至左求值

例6-4 演示函数实参求值顺序。

img505

如对printf语句中的实参++i,−−i,i++,i−−按照从右至左的顺序求值,例6-4的运行结果应为:

8

7

7

8

如对printf语句中的实参++i,−−i,i++,i−−按照从左至右的顺序求值,例6-4的运行结果应为:

9

8

8

9

应特别注意的是,无论是从左至右求值,还是从右至左求值,其输出顺序都是不变的,即输出顺序总是和实参表中实参的顺序相同。由于Turbo C规定是自右至左求值,所以结果为8,7,7,8。上述问题可上机调试,加深理解。

2.函数返回值

函数被调用之后,将执行函数体中的程序段,取得并返回给主调函数一个值,称这个值为函数返回值,如调用正弦函数取得正弦值,调用例6-3的min函数取得的最小数的值等。对函数返回值(或称函数的值)有以下一些说明:

(1)函数的值只能通过return语句返回主调函数。return 语句的一般形式为:

  return 表达式;

或者为:

  return(表达式);

该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。

(2)函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数定义类型为准,自动进行类型转换。

(3)不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”,如下面定义的函数s并不向主函数返回函数值:

void s(int n)

{ …

}

一旦函数被定义为空类型后,就不能在主调函数中使用被调函数的函数值了,例如,在定义s为空类型后,在主函数中写下述语句“sum=s(n);”就是错误的。为了使程序有良好的可读性并减少出错,凡不要求返回值的函数都应定义为空类型。

常见的编程错误6.1

img506 将函数形参表中的同类型参数声明成“double x,y;”而不是“double x,double y;”,这在语法上是错误的,函数参数表中的每一个参数都需要一个显示的类型说明。

img507 如果函数原型、函数头部以及函数调用在对应的实参和形参中的参数个数、类型、参数顺序和返回类型有所不同,就会发生错误。

良好的编程习惯6.2

img508 有很多参数的函数可能执行了太多的任务,可以考虑将这种函数分成多个小函数以便各自执行独立的任务,尽量把函数头部限制在一行。

img509 在函数中总提供函数原型,即便在函数使用之前已经定义了该函数。提供函数原型说明避免了按照函数定义的顺序来使用函数。