9.1.1.什么是函数?
function 是完成特定任务的独立程序代码单元。一些函数找出一个值供程序使用,一些函数执行某些动作。一般而言,函数可以同时具备以上两种功能。
9.1.2.为什么要使用函数?
使用函数可以省去编写重复代码的苦差。函数可以让程序更加的模块化以及提高了程序代码的可读性,更加方便后期修改、完善。
91.3.简单函数的使用
这个是典型的ANSIC风格的函数原型:
void starbar (void);
圆括号表明 starbar 是一个函数名,第一个void表示的是函数类型,void类型表示函数没有返回值。第二个void表示该函数不带参数。分号表示这是在声明函数,不是定义函数。也就是说,这行声明了程序将使用一个名为starbar()、没有返回值、没有参数的函数,并告诉编译器在别处查找函数的定义。
程序中starbar()和main()定义形式相同。首先函数头包括函数类型、函数名和圆括号。接着是左花括号、变量声明、函数表达式语句,最后以右花括号结束。注意,函数头中的starbar()后面没有分号,告诉编译器这是在定义starbar(),而不是调用函数或者声明函数原型。
9.14函数参数
show_n_char(char ch, int num)(展示一个字符n次)
该行告知编辑器show_n_char()使用两个参数ch和num,ch是char类型,num是int类型。这两个变量称为形式参数,简称形参。和定义在函数中的变量一样,形式参数也是局部变量,属于该函数私有。这意味着在其他函数中使用同名变量不会引起名称冲突。每次调用函数,就会给这些变量赋值。
注意,ANSI C要求在每个变量前都声明其类型。也就是说,不能像普通变量声明那样使用同一类型的变量列表。:
void dibs(int x, y, z)//无效的函数头
void dibs (int x,int y,int z)//有效的函数头
9.1.5 声明带形式参数函数的原型
void show_n_char(char ch,int num);
void show_n_char(char,int);
在原型中使用变量名并没有实际创建变量,char仅代表一个char类型的变量。
void show_n_char();
这是一种曾经的标准
9.1.6调用带有实际参数的函数
在函数调用中,实际参数提供了ch和num的值。
show_n_char(SPACE,12);
实际参数是空格字符和12.这两个值被赋予给形参:变量ch和num。简而言之,形式参数是被调函数(外部函数)的变量,实际参数是主调函数(调用另外一个被调函数的函数)赋给被调函数的具体值。
show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2);
构成该函数第2个实际参数是一个很长的表达式,变量还是一般表达式,但是具体的值经过计算后已经传给形参。
实际参数是具体的值,该值要被赋给形式参数的变量。因为被调函数使用的值都是从主调函数中拷贝而来,所以无论被调函数对拷贝数据进行什么操作,都不会影响主调函数中的原始数据。
注意:实际参数和形式参数
实际参数是出现在函数调用圆括号中的表达式,形式参数是函数定义的函数头中声明的变量。调用函数时,创建了声明为形式参数的变量并初始化为实际参数的求值结果。
9.1.7 使用return从函数中返回值
关键字return后面的表达式的值就是函数的返回值,返回值不一定是变量的值,也可以是任意表达式的值。
如果函数的返回值的类型与函数声明的类型不匹配,实际得到的返回值相当于把函数中指定的返回值赋给与函数类型相同的变量所得到的值。
return;
这条语句会导致终止函数,并把控制返回给主调函数。因为return 后面没有任何的表达式,所以没有返回值,只有在Void函数中才会用到这种形式。
9.1.8 函数类型
声明函数的时候必须声明函数的类型。带返回值的函数类型应该与其返回值类型相同,而没有返回值的函数应该声明为void类型。
类型声明是函数定义的一部分,函数类型指的是返回值的类型,不是函数参数的类型。
例如下面函数头定义了一个带两个int类型的参数的函数,但其返回值的类型是double类型。
double klink(int a, int b)
要正确使用函数。程序在第一次使用函数之前必须知道函数的类型。
两种类似方法:
#include <stdio.h>
int imin(int,int);
int main(void)
{
int evil1,evil2;
或者是
#include <stdio.h>
int main (void)
{
int imin(int, int);
注意这两种情况,函数的原型都声明在函数之前。
9.1.9无参数和未指定参数
viod print_name();
一个支持ANSI C 的编译器会假定用户没有使用函数原型来声明函数,它将不会检查参数,为了表明函数确实没有参数,应该在圆括号中使用void关键字:
void print_name(void)
再调用该函数时,编译器会检查以确保没有使用参数。
一些函数接受(printf()和scanf())许多参数,例如对于printf(),第一个参数是字符串,但是其余参数和数量都不固定。对于这种情况,ANSI C 允许使用部分原型。
网友评论