C语言非常道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3.1 函数

在前面,我们已经讲过如何编写从1加到100的代码,如果要将这些内容保存为源文件的话,那么,在很多初学者看来,该文件的内容应该是这样的:

                unsigned  long  long  int  n,  sum;

                n  =  1;
                sum  =  0;

                while (n  <=  100)
                {
                    sum  =  sum  +  n;
                    n  =  n  +  1;
                }

作为我们的第一个C语言程序,这么编写似乎是很自然的,符合直觉。你看,源文件的内容不就应该是把要做的事一一交代清楚吗?!

但是很遗憾,C语言有它自己的法则,它的创造者坚持认为语句不能是源文件的直接组成部分,而只能出现在函数体内,就像这样:

                int  main (void)
                {
                    unsigned  long  long  int  n,  sum;

                    n  =  1;
                    sum  =  0;

                    while (n  <=  100)
                    {
                      sum  =  sum  +  n;
                      n  =  n  +  1;
                    }

                    return  0;
                }

不管是在哪里,都会有很多重复性的劳动在等着我们,只不过每次做的时候,初始条件不同。一个比较简单的例子是老师让我们计算圆形的面积,每次求解圆面积的时候,过程都一样,只不过老师给出的半径或者直径不同。

计算机程序也是如此,可以将重复使用的代码组织在一起,形成一个独立的代码块以便重复使用。这种手段是如此重要、如此有用,以至于所有微处理器都提供了相应的机器指令来调用这种代码块,而所有的编程语言也同样都会支持这种机制和做法。在处理器、机器语言和汇编语言中,这种可重复使用的代码块叫过程或者例程,而在C语言里称为函数。

每个函数都有自己的名字,用于指示(代表)那个代码块。如果没有名字,你就无法通过指名道姓来使用它。在上面的这个例子中,main就是函数的名字,我们可以简单地称之为“main函数”,或者“函数main”。

很多函数需要从外部接受一些数据,比如圆的半径、从1加到几的“几”,等等,这称为参数,参数在函数名后面的一对圆括号中指定。如果函数不接受任何参数,则括号中的内容应当为关键字“void”。显然,以上main函数就不接受任何参数。

你可以把函数看成一支小分队,小分队接受调动出去执行任务,任务完成后还可以带点什么东西回来。类似地,对函数的使用称为函数调用,很多函数可能还要返回数据给它的调用者,但每个函数只能有一个返回值。返回值是有类型的,这个类型需要在函数名字的左侧指定。显然,上述main函数返回一个int类型的值。为了描述方便,我们把函数返回值的类型称为函数的返回类型。

有些函数只做一些内部操作而并不返回任何值,在这种情况下,它仅仅是简单地返回到调用者。如果一个函数不返回任何值,则函数名左侧的类型应指定为关键字“void”。

函数是可以重复使用的代码块,因此,一个完整的函数还必须包含可执行的代码,称为函数体。如以上代码所示,函数体只能是一个复合语句,由一对花括号“{”和“}”,以及位于花括号里的声明和语句组成。

因此,一个完整的函数包括函数名、参数声明、返回类型声明和函数体。类似在程序中声明一个变量,在程序中编写一个函数实际上也是声明了一个函数,称为函数声明。