程序清单6.20 power.c程序
//power.c --计算数值的整数次幂#includedouble 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 121.2 to the power 12 is 8.9161Enter next pair of numbers or q to quit .2162 to the power 16 is 65536Enter 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()函数。此外函数经常放在单独的文件中,所以前向声明是必不可少的。