B.7.2 函数调用
一般格式:
name(arg1,arg2,..)
这个格式调用一个名为name的函数,并将值arg1、arg2……作为参数传递给函数。如果函数不接收参数,只要指定开始和结束圆括号即可(例如initialize())。
如果要调用一个函数,而该函数定义在这个调用之后或者定义在另一个文件中,则应该将函数的原型声明包括进来,这种声明的一般格式为:
returnType name(type1 param1,type2 param2,..);
这告知编译器该函数的返回类型、所带的参数数目和每个参数的类型。作为一个例子,程序行
long double power(double x, int n);
将power声明为一个函数,该函数返回一个long double值并接受两个参数—第一个参数类型为double,第二个参数类型为int。圆括号内的参数名实际上是假名,如果需要的话可以将其省略,因此
long double power(double, int);
作用是完全一样的。
如果编译器预先遇到函数定义或者函数的原型声明,那么在调用函数时,每一个参数的类型将会自动转换以便与函数要求的类型匹配。
如果编译器既没遇到函数的定义也没遇到原型声明,它将假定函数返回一个int类型的值,并将所有float类型的参数转换为double类型,而且如“基本数据类型转换”一节中所述的那样对任何整型参数进行整型提升。其他的函数参数在传递时则无需进行转换。
接受不定数目参数的函数必须这样声明。否则,编译器将基于调用中实际使用的参数数目,任意假定函数接受某个固定的参数数目。
如果函数是使用旧的格式定义的(参见“函数定义”一节),函数的声明将会采用以下格式:
returnType name();
如前段所描述,这种函数的参数将被转换。
返回类型声明为void的函数,会使编译器标记任何尝试利用返回值的函数调用。
函数的所有参数是通过值传递的;因此,它们的值不能被函数更改。然而,如果将一个指针传递给某个函数,这个函数就可以更改指针引用的值,但它仍然不能更改指针变量本身的值。