本文参考C Primer Plus进行C语言学习
文章目录
- 使用函数返回值的循环
- 使用带返回值的函数
一.使用函数返回值的循环
#include<stdio.h>
double power(double n,int p);
int main()
{
double x,xpow;
int exp;
printf("Enter a number and the posotive 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;
}
该例的while循环是之前讨论过的一般形式。输入 1.2 12,scanf()成功读入两值,并返回2。 循环继续。输入q会使scanf()返回值为0,因为q与%lf不匹配。类似,输入2.3 q也会使循环结束,此时,scanf()返回1。
现在分析一下函数相关内容。powwer()函数在程序中出现了三次。
首次是:
double power(double n,int p);
这是power()函数的原型,它声明将使用一个名为power()的函数。开头的关键字double表明power()函数返回一个double类型的值。编译器要知道power()函数返回一个double类型,才能知道有多少字节的数据,以及如何解释它们。这就是为什么必须声明函数的原因。
第2次出现是:
xpow=power(x,exp);
程序调用power(),把两个值传递给它。该函数计算x的exp次幂,并把计算结果返回给主调函数。在主调函数中,返回值将被赋给变量xpow。
第3次出现是:
double power(double n,int p)
这里,power()有两个形参,一个是double类型,一个是int类型,分别由变量n和变量p表示。注意,函数定义的末尾没有分号,而函数原型的末尾有分号。
power()函数用for循环计算n的p次幂,并把结果赋值给pow,然后返回pow的值。
return pow;
二.使用带返回值的函数
声明函数、调用函数、定义函数、使用关键字return,都是定义和使用带返回值函数的基本要素。这里,读者可能有一些问题。例如,既然在使用函数返回值之前要声明函数,那么为什么在使用scanf()的返回值之前没有声明scanf()?为什么在定义中说明了power()的返回类型为double,还要单独声明这个函数?
我们先回答第2个问题。编译器在程序中首次遇到power()时,需要知道 power()的返回类型。此时,编译器尚未执行到power()的定义,并不知道函数定义中的返回类型是double。因此,必须通过前置声明(forward declaration)预先说明函数的返回类型。前置声明告诉编译器,power()定义在别处,其返回类型为 double。如果把 power()函数的定义置于main()的文件顶部,就可以省略前置声明,因为编译器在执行到main()之前已经知道power()的所有信息。但是,这不是C的标准风格。因为main()通常只提供整个程序的框架,最好把main()放在所有函数定义的前面。另外,通常把函数放在其他文件中,所以前置声明必不可少。
接下来,为什么不用声明 scanf()函数就可以使用它?其实,你已经声明了。stdio.h 头文件中包含了scanf()、printf()和其他I/O函数的原型。scanf()函数的原型表明,它返回的类型是int。