创造并使用简单函数
直接上c primer plus的经典例子
目标:创造一个在一行打印40个星号的函数,并在一个打印表头的程序中使用该函数
分析:
- 程序在3处使用了starbar标识符:函数原型告诉编译器函数starbar( )的类型;
- 函数调用表明在此处执行函数;
- 函数定义明确地指定了函数要做什么
- 函数跟变量一样,有多种类型。任何程序在使用函数之前都要声明该函数的类型。因此,在main()函数定义的前面出现了下面的ANSI C 风格的函数原型:
void starbar (void);
圆括号表明starba 是一个函数名。
- 第1个void是函数类型,void类型表明函数没有返回值。
- 第2个个void(在圆括号中)表明该函数不带参数。
- 分号表明这是在声明函数,不是定义函数。
也就是说,这行声明了程序将使用一个名为starbar()、没有返回值、没有参数的函数,并告诉编译器在别处查找该函数的定义。
- 一般而言,函数原型指明了函数的返回值类型和函数接受的参数类型。这些信息称为该函数的签名(signature)。对于starbar()函数而言,其签名是该函数没有返回值,没有参数
- 程序把starbar()原型置于main()前。当然,也可以放在main()里面的声明变量处。放在哪个位置都可以。
- 在main()中,执行到下面的语句时,调用了starbar()函数: starbar(); 这是调用void类型函数的一种形式。当计算机执行到starbar();语句时,会找到该函数的定义并执行其中的内容。执行完starbar()中的代码后,计算机返回主调函数继续执行下一行(本例中,主调函数是main()),见图
- 程序中starbar()和main()的定义形式相同。首先函数头包括函数类型、函数名和圆括号,接着是左花括号(即大括号{})、变量声明、函数表达式语句,最后以右花括号结束,如图。
注意:函数头中的starbar()后面没有分号,告诉编译器这是定义starbar(),而不是调用或者声明函数原型。
- 程序把starbar()和main()放在一个文件中。当然,也可以把它们分别放在文件中。把函数都放在一个文件中的单文件形式比较容易编译,而使用多个文件的单文件方便在不同的程序中使用同一个函数。如果把函数放在一个单独的文件中,要把#define和#include指令也放入该文件。这种情况后面再讨论。main()的右花括号告诉编译器该函数结束的位置,后面的starbar()函数头告诉编译器starbar()是一个函数。
- starbar()函数中的变量count是局部变量,意思是该变量只属于starbar()函数。可以在程序中的其他地方(包括main())中使用count,这不会引起名称冲突,它们是同名的不同变量。
如果把starbar()看作是一个黑盒,那么它的行为是打印一行星号。不用给该函数提供任何输入,因为调用它不需要其他信息。而且它没有返回值,所以也不给main()提供(或返回)任何信息。简而言之,starbar()不需要与主函数通信。
下次介绍一个函数间需要通信的例子。
现在是凌晨3点1分,今天下午睡了四五个小时,今晚估摸着能睡四个小时这样子,麻烦了麻烦了,作息紊乱了👀
That's all.