C Primer Plus学习 十六 函数概述
2016-10-06 11:05
232 查看
首先,什么是函数?函数(fimction)是用于完成特定任务的程序代码的自包含单元。尽管C中的函数和 其他语言中的函数、子程序或子过程等扮演着相同的角色,但是在细节上会有所不同。某些函数会导致执行 某些动作,比如primf()可使数据呈现在屏幕上;还有一些函数能返回一个值以供程序使用,如strlen () 将指定字符串的长度传递给程序。一般来讲,一个函数可同时具备以上两种功能。
为什么使用函数?第一,函数的使用可以省去重复代码的编写。如果程序中需要多次使用某种特定的 功能,那么只需编写一个合适的函数即可。程序可以在任何需要的地方调用该函数,并且同一个函数可以 在不同的程序中调用,就像在许多程序中需要使用putchar ()函数一样。第二,卽使某种功能在程序中只 使用一次,将其以函数的形式实现也是有必要的,因为函数使得程序更加模块化,从而有利于程序的阅读、
修改和完善。
/* letheadl.c */
#include <stdio.h>
#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis* CA 94904"
#define WIDTH 40
void starbar (void); /* 声明函数原型 */
int main (void)
{
starbar ();
printf ("%s\n",NAME);
printf ("%s\n", ADDRESS);
printf ("%s\n", PLACE);
starbar ();/* 使用函数*/
return 0;
}
void starbar (void) /* 定义函数 */
{
int count;
for (count = 1; count <= WIDTH;count++)
putchar ('*');
putchar (' \n');
}
关于这个程序有以下几点需要注意:
• starbar标识符在不同位置被使用了 3次:函数原型(function prototype)告知编译器starbar ()的 函数类型,函数调用(functioncall)导致该函数的执行,而函数定义(functiondefinition)则确切
指定了该函数的具体功能。
•函数同变量一样有多种类型。任何程序在使用函数之前都需要声明该函数的类型。因此,下面这 个ANSI C风格的原型出现在main ()函数的定义之前:
void starbar (void);
圆括号表明starbar是一个函数名。第一个void指的是函数类型:它的意思是该函数没有返回值。 第二个void (位于圆括号内)表明该函数不接受任何参数。分号的作用是表示该语句是进行函数 声明而不是函数定义◊也就是说,这一行声明了程序将使用一个名为starbar()且函数类型
bc5c
为void 的函数,同时通知编译器需要在其他位置找到该函数的定义。对于不识别ANSI C原型的编译器, 只需声明函数的类型,就像下面这样: void starbar
();
•程序在main ()中通过使用函数名后跟圆括号和分号的格式调用函数starbar (),语句如下: starbar ();这是void类型函数的一般调用形式。当计算机执行到starbar ():语句时,它找到Starbar ()函 数并执行其中的指令。执行完starbar ()中的代码后,计算机返回到调用函数(calling function) 的下一行继续执行。在本例中,调用函数是main ()。
*程序中starbar ()和main ()具有相同的定义格式,即首先以类型、名称和圆括号开始,接着是开始花 括号、变量声明、函数语句定义以及结束花括号。注意此处的starbar ()后没有分号,这告诉编译器您是在定义函数starbar (),而不是 在调用它或声明它的原型。
•程序把starbar ()和main ()包含在同一个文件中,您也可以将它们放在不同的两个文件之中。单文件形式比较容易编译,而使用两个文件则有利于在不同的 程序中使用相同的函数。如果您把函数写在了另外一 个单独的文件中,则在那个文件中必须加入#define 和#include指令。在后续内容中我们将讲述两个或多个文件的使用。就目前而言,我们将所有函数都包含在一个文件中。main ()的结束花括号告诉编译器该函数在这里结束,后面的starbar
()函数头表示staibar ()是一个函数。
• starbar ()中的变量count是一个局部(local)变量。这意味着该变量只在starbar ()中可用。即使您在其他函数(包括main ()函数)中使用名称count,也不会出现任何冲突,您将得到具有同一名称的多个单独的、互不相关的变量。
如果把starbar ()看作一个黑盒子,那么它的执行结果是打印出一行星号。因为不需要来自调用函数 的任何信息,所以它没有输入参数。同时它不向main ()提供(返回)任何信息,因此starbar ()也没有返回值。简言之,starbar ()不需要同调用函数进行任何通信。
为什么使用函数?第一,函数的使用可以省去重复代码的编写。如果程序中需要多次使用某种特定的 功能,那么只需编写一个合适的函数即可。程序可以在任何需要的地方调用该函数,并且同一个函数可以 在不同的程序中调用,就像在许多程序中需要使用putchar ()函数一样。第二,卽使某种功能在程序中只 使用一次,将其以函数的形式实现也是有必要的,因为函数使得程序更加模块化,从而有利于程序的阅读、
修改和完善。
/* letheadl.c */
#include <stdio.h>
#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis* CA 94904"
#define WIDTH 40
void starbar (void); /* 声明函数原型 */
int main (void)
{
starbar ();
printf ("%s\n",NAME);
printf ("%s\n", ADDRESS);
printf ("%s\n", PLACE);
starbar ();/* 使用函数*/
return 0;
}
void starbar (void) /* 定义函数 */
{
int count;
for (count = 1; count <= WIDTH;count++)
putchar ('*');
putchar (' \n');
}
关于这个程序有以下几点需要注意:
• starbar标识符在不同位置被使用了 3次:函数原型(function prototype)告知编译器starbar ()的 函数类型,函数调用(functioncall)导致该函数的执行,而函数定义(functiondefinition)则确切
指定了该函数的具体功能。
•函数同变量一样有多种类型。任何程序在使用函数之前都需要声明该函数的类型。因此,下面这 个ANSI C风格的原型出现在main ()函数的定义之前:
void starbar (void);
圆括号表明starbar是一个函数名。第一个void指的是函数类型:它的意思是该函数没有返回值。 第二个void (位于圆括号内)表明该函数不接受任何参数。分号的作用是表示该语句是进行函数 声明而不是函数定义◊也就是说,这一行声明了程序将使用一个名为starbar()且函数类型
bc5c
为void 的函数,同时通知编译器需要在其他位置找到该函数的定义。对于不识别ANSI C原型的编译器, 只需声明函数的类型,就像下面这样: void starbar
();
•程序在main ()中通过使用函数名后跟圆括号和分号的格式调用函数starbar (),语句如下: starbar ();这是void类型函数的一般调用形式。当计算机执行到starbar ():语句时,它找到Starbar ()函 数并执行其中的指令。执行完starbar ()中的代码后,计算机返回到调用函数(calling function) 的下一行继续执行。在本例中,调用函数是main ()。
*程序中starbar ()和main ()具有相同的定义格式,即首先以类型、名称和圆括号开始,接着是开始花 括号、变量声明、函数语句定义以及结束花括号。注意此处的starbar ()后没有分号,这告诉编译器您是在定义函数starbar (),而不是 在调用它或声明它的原型。
•程序把starbar ()和main ()包含在同一个文件中,您也可以将它们放在不同的两个文件之中。单文件形式比较容易编译,而使用两个文件则有利于在不同的 程序中使用相同的函数。如果您把函数写在了另外一 个单独的文件中,则在那个文件中必须加入#define 和#include指令。在后续内容中我们将讲述两个或多个文件的使用。就目前而言,我们将所有函数都包含在一个文件中。main ()的结束花括号告诉编译器该函数在这里结束,后面的starbar
()函数头表示staibar ()是一个函数。
• starbar ()中的变量count是一个局部(local)变量。这意味着该变量只在starbar ()中可用。即使您在其他函数(包括main ()函数)中使用名称count,也不会出现任何冲突,您将得到具有同一名称的多个单独的、互不相关的变量。
如果把starbar ()看作一个黑盒子,那么它的执行结果是打印出一行星号。因为不需要来自调用函数 的任何信息,所以它没有输入参数。同时它不向main ()提供(返回)任何信息,因此starbar ()也没有返回值。简言之,starbar ()不需要同调用函数进行任何通信。
相关文章推荐
- C++ Primer Plus学习:第七章 函数-C++的编程模块(4)
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
- C Primer Plus学习 二十八 string.h strlen ()函数
- C Primer Plus学习 二十四 字符串输入 fgets ()函数
- C++ Primer Plus学习:第八章 函数探幽(1)
- C++ Primer Plus学习笔记之STL函数对象
- C Primer Plus学习 十一 ctype.h系列字符函数
- 【C语言学习】《C Primer Plus》第2章 C语言的概述
- C Primer Plus学习 二十七 string.h strcat()函数
- 2012/1/19 《C++ Primer Plus》第七章:函数——C++编程模块 学习笔记
- C++ Primer Plus学习之函数篇二
- 学习《C Primer Plus》---存储类和函数
- C Primer Plus学习 二十 函数、数组和指针
- C++ Primer Plus学习:第七章 函数-C++的编程模块(2)
- 2012/1/19 《C++ Primer Plus》第七章:函数——C++编程模块 学习笔记
- 学习C++.Primer.Plus 8 函数探幽
- C++ Primer Plus学习之函数篇一
- C Primer Plus学习 二十五 字符串输入 puts ()函数
- C Primer Plus学习 二十三 字符串输入 gets ()函数