程序清单6.20 power.c程序
//power.c --计算数值的整数次幂
#include <stdio.h>
double power(double n,int p); //ANSI原型
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); //函数调用
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) //函数定义
{
double pow = 1;
int i;
for (i=1;i<=p;i++)
pow*=n;
return pow; //返回pow的值
}
/*下面是一个运行示例:
Enter a number and the positive integer power to which
the number will be raised.Enter q to quit.
1.2 12
1.2 to the power 12 is 8.9161
Enter next pair of numbers or q to quit .
2
16
2 to the power 16 is 65536
Enter next pair of number or q to quit .
q
Hope you enjoyed this power trip --bye!
*/
6.12.1程序讨论
main()程序是一个驱动程序的例子,驱动程序是用来测试一个函数的短小的程序。
现在我们来看一下函数相关的一些事情。power()函数在这个程序中出现了三次,第一次出现是这样的:
double power (doube n,int p);
这个语句声明程序将使用一个power()的函数。开始的关键字double表明power()函数会返回一个类型为double 的值。编译器需要知道power()的返回值类型,这样它才能知道 需要多少字节的数据以及如何解释它们,这也是您必须声明函数的原因。括号中的double n,int p说明power()接受两个参数和什么类型的参数。
第二次出现是这样的:
xpow=power(x,exp);
程序在这时辰 调用 了这个函数,并传递给它两个值。函数计算x的exp次幂,然后把结果返回给调用,接着返回值又被赋给变量xpow。
第三次出现是在函数定义的开始:
double power (double n ,int p ) //函数定义
在这里power()接受由变量n和p表示的两个参数。请注意在函数定义时,power()后面没有分号,而在函数声明时是有分号的。在函数头之后就是完成power()所做的事情的代码。
回忆一下,函数使用for循环来计算n的p次幂并把它赋值给pow。下面这行使pow成为函数的返回值 。
return pow
6.12.2 使用具有返回值的函数
声明函数、调用函数、定义函数、使用return关键字,这些就是在定义并使用具有返回值的函数时的基本要素。
为什么除了在定义中说明 power()的类型为double之外,还必须单独的声明这个函数?
编译器在程序中第一次遇到 power()时,它需要知道power()是什么类型。而此时编译器还没有遇到power()的定义,所以它并不知道定义中说明 了返回类型为double。为了帮助编译器,要通过使用一个前向声明来预先说明它是什么类型。这个声明通知编译器power()在其他地方定义而且它的返回值类型为double。如果您把power()的定义放在main()之前,就可以省略前向声明,因为编译器在到达main()之前已经知道了关于power()的所有信息。这是这不是标准c的风格。因为main()通常提供一个程序 的整体框架,所以最好是首先给出main()函数。此外函数经常放在单独的文件中,所以前向声明是必不可少的。