1.3 利用函数可以简化编程
从上一节的例程1-2中可以发现,打印一行,就已经要printf十几次了。这样打印一个月历,就会打印几十次,整个源文件里全部是printf的重复了。这种程序不仅让人眼花缭乱,而且可读性差。那么有没有比较好的办法呢?
通过分析例程1-2我们发现,这个月历一共有6行。那么,我们可以一行行地进行打印,这样看起来结构更加清晰、简单,如例程1-3所示。
读者不仅可以调用C标准库提供的函数,也可以定义自己的函数。事实上定义自己的函数并不是新内容,比如例子中定义的main函数。main函数的特殊之处在于执行程序时它自动被操作系统调用,操作系统就认准了main这个名字,除了名字特殊之外,main函数和别的函数没有区别。
看看这次的main函数,它里面调用了我们定义的6个函数。其中,printTitle、printLine1、printLine2、printLine3、printLine4、printLine5都是我们起的名字,这些名字都能反映出来这个函数要做的事情。比如printTitle就是打印一个标题,printLine1就是打印第1行。而在源文件的其他部分,需要有这6个函数的实现,为了节省空间我们只是示例了printTitle。同时,我们定义了一个函数—printfSpace,用于打印空格,这样在函数中如果需要打印一个空格,就可以直接调用printfSpace。

例程1-3 使用函数简化编程
这里,读者可以体会一下函数的最主要作用,即组织代码,提高代码的可读性,就跟我们写文章时,通过分段来提高文章的可读性一样。函数如同文章中的段落,每个函数实现一个基本的功能。然后通过函数之间的调用关系实现一个有意义的大的功能。读代码和读文章不一样,按从上到下、从左到右的顺序读代码未必是最好的,代码也有它的阅读顺序。比如上面的例子,按源文件的顺序应该是先看printfSpace,再看printTitle,然后看main。但是,这种阅读方法,不能让我们知道程序要实现的整个功能。如果换一个角度,按代码的执行顺序来读也许会更好:首先执行的是main函数中的语句,在printTitle之后调用了printLine1、printLine2等,知道这是在打印一个标题和6行。这时再去看printTitle的定义,其中又调用了printfSpace,这时再去看printfSpace的定义,里面有一条printf。这样就是一个比较有意义的阅读顺序。
有些读者或许会问,为什么在上面我们说定义了函数?在C语言中,有两个与函数有关的很重要的概念,即“声明”和“定义”。“声明”只是告诉编译器有这样一个函数,不一定有其具体实现。例如:
void printfTitle();
这种写法只能叫函数“声明”,而不能叫函数“定义”,只有带函数体的“声明”才叫“定义”。一般将“声明”放在头文件中,而将“定义”存放在.c源文件中。
通过函数的方式,程序更具有可读性,同时更容易维护。比如,若要修改第4行打印的方法,那么直接在printLine4这个函数中进行修改。通过这个例子可以看到,函数可以让程序更加简洁。更具体的函数使用方法我们会在后面的章节中讲解。