从头学C(8)函数

0

再复杂的需求,归根结底,无外乎两点:我有什么?我想要什么?

我只告诉你我所拥有的资源,你只需反馈给我想要的结果,至于你怎么做,和我的整体结构没有任何关系。

函数为计算的封装提供了一种简便的方法,我们不需要考虑它是如何实现的,就可以直接去调用它,由它返回我们想要的结果。实际编程中也会接触到各种各样的函数调用,这些函数将很多流程封装成一个个函数,使代码段更清晰易读。

第一章 导言 >> 1.7 函数

前面我们已经接触了诸如printf()、putchar()、getchar()这样的库函数,我们只需要按照ANSI C的标准去调用这些函数,这一节我们学习如何自己来定义并使用一个函数。

目的:编写一个求幂的函数power(m,n),用于计算整数m的n次幂。

解决:

#include <stdio.h>

int power(int m, int n);
/* 测试power函数 */
main()
{
        int i;

        for(i = 0; i < 10; ++i)
                printf("%d %d %d\n", i, power(2,i), power(-3,i));
        return 0;
}

/* power函数:求底数base的n次幂,其中n>=0 */
int power(int base, int n)
{
        int i, p;

        p = 1;
        for(i = 1; i <= n; ++i)
                p = p * base;
        return p;
}

 备注:这里只是一个简单的求幂函数,只能处理较小的整数的正整数次幂。其实标准库中提供了一个计算x的y次幂的函数pow(x,y)。

函数定义的一般形式为:

返回值类型 函数名(0个或多个参数声明)
{
    声明部分
    语句序列
}

main函数在printf()中调用了两次power()函数,每次调用时,main函数就向power函数传递两个参数,power函数执行完之后,返回一个int型值,该返回值传递给printf函数,最后由printf函数打印出来。(注意:并不是所有函数的返回值都是int型)

power函数的第一行语句:

int power(int m, int n);

声明了参数的类型、函数的名字及函数的返回值类型。表明power函数有两个int类型的参数,并返回一个int类型的值。这种声明我们称之为函数原型。它必须与函数的定义和用法一致,否则编译时会报错。

函数原型与函数定义的参数名字不要求相同,事实上,函数原型中的参数名是可选的,上面的函数原型也可以写成如下这般:

int power(int, int);

但是,恰当的参数名可以起到很好的提示作用,我们还是建议在函数原型中总是加上参数名。

函数的参数仅在该函数内部有效,因此,不同函数可以使用同名的参数。比如main函数中的i和power函数中的i之间就没有任何关系,况且我们中华泱泱大国那么多同名的人,不过也只是同名而已。

我们通常把函数定义中圆括号内列表中的变量称为形式参数(简称“形参”)。而把函数调用中与形式参数对应的值称为实际参数(简称“实参”)。比如power(2,i)的调用中,base是形参,而2才是实参。

函数调用的返回值通过return语句返回。关键字return后面可以跟任何表达式,其形式如下:

return 表达式;

然后,就像“不是每一滴牛奶,都叫特仑苏”一样,不是每一个函数都有返回值,不带表达式的renturn语句表示将控制权返回给调用者,而不返回任何值,执行到return也就表示当前这个函数“走到了尽头”。

细心一点的童鞋可能会发现,这里的main函数有了一个“小尾巴” ( return 0;)。因为main函数本身也是一个函数,因此也向其调用者返回一个值,该调用者实际上就是程序的执行环境。一般来说,返回值为0表示正常终止,返回值为非0表示出现异常情况或出错结束条件。之前的例子都省略了return语句,而在以后的例子中会把return加入进来,以强调程序还要向其执行环境返回状态。

ANSI C和较早C语言之间的最大区别在于函数的声明与定义方式的不同。为避免混淆,这里就不详细列举了,感兴趣的童鞋可以去了解下。

Leave A Reply