6.12 使用函数返回值的循环示例
整数次幂(math.h)库提供了一个更强大幂函数pow(),可以使用浮点指数。
该示例有3个主要任务:设计算法、在函数中表示算法并返回计算结果、提供一个测试函数的便利方法。
编写一个有返回值的函数,要完成以下内容:
1.定义函数时,确定函数的返回类型;
2.使用关键字return表明待返回的值。
要声明函数的返回类型,在函数名前写出类型即可,就像声明一个变量那样。关键字return表明该函数将把它后面的值返回给主调函数。
函数返回一个变量的值。返回值也可以是表达式的值。
函数将计算表达式的值,并返回该值。
// power.c -- raises numbers to integer powers
#include
double power(double n, int p); // ANSI prototype
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while (scanf("%lf%d", &x, &exp) == 2)
{
xpow = power(x,exp); // function call
printf("%.3g to the power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p) // function definition
{
double pow = 1;
int i;
for (i = 1; i <= p; i++)
pow *= n;
return pow; // return the value of pow
}
/* 输出:
*/
6.12.1 程序分析
main()是一个驱动程序(driver),即被设计用来测试函数的小程序。
编译器要知道power()函数返回值的类型,才能知道有多少字节的数据,以及如何解释它们。这就是为什么必须声明函数的原因。
注意,函数定义的末尾没有分号,而函数原型的末尾有分号。在函数头后面花括号中的内容,就是power()完成任务的代码。
6.12.2 使用带返回值的函数
声明函数、调用函数、定义函数、使用关键字return,都是定义和使用带返回值函数的基本要素。
为什么在定义中说明了power()的返回类型为double,还要单独声明这个函数?
因为编译器在程序中首次遇到power()时,需要知道power()的返回类型。此时,编译器尚未执行到power()的定义,并不知道函数定义中的返回类型是double。因此,必须通过前置声明(forward declaration)预先说明函数的返回类型。前置声明告诉编译器,power()定义在别处,其返回类型为double。如果把power()函数的定义置于main()的文件顶部,就可以省略前置声明,因为编译器在执行到main()之前已经知道power()的所有信息。但是,这不是C的标准风格。因为main()通常只提供整个程序的框架,最好把main()放在所有函数定义的前面。另外,通常把函数放在其他文件中,所以前置声明必不可少。
为什么不用声明scanf()函数就可以使用它?
其实,你已经声明过了。stdio.h头文件中包含了scanf()、printf()和其他I/O函数的原型。