C语言进修教程第五章-函数(2)
函数界说的一般形式
1.无参函数的一般形式
范例说明符 函数名()
{
范例说明
语句
}
个中范例说明符和函数名称为函数头。 范例说明符指明白本函数的范例,函数的范例实际上是函数返回值的范例。 该范例说明符与第二章先容的各类说明符沟通。 函数名是由用户界说的标识符,函数名后有一个空括号,个中无参数,但括号不行少。{} 中的内容称为函数体。在函数体中也有范例说明, 这是对函数体内部所用到的变量的范例说明。在许多环境下都不要求无参函数有返回值, 此时函数范例符可以写为void。
我们可以改为一个函数界说:
void Hello()
{
printf ("Hello,world \n");
}
这里,只把main改为Hello作为函数名,其余稳定。Hello 函数是一个无参函数,当被其它函数挪用时,输出Hello world字符串。
2.有参函数的一般形式
范例说明符 函数名(形式参数表)
型式参数范例说明
{
范例说明
语句
}
有参函数比无参函数多了两个内容,其一是形式参数表, 其二是形式参数范例说明。在形参表中给出的参数称为形式参数, 它们可以是各类范例的变量, 各参数之间用逗号隔断。在举办函数挪用时,主调函数将赋予这些形式参数实际的值。 形参既然是变量,虽然必需赐与范例说明。譬喻,界说一个函数, 用于求两个数中的大数,可写为:
int max(a,b)
int a,b;
{
if (a>b) return a;
else return b;
}
第一行说明max函数是一个整型函数,其返回的函数值是一个整数。形参为a,b。第二行说明a,b均为整型量。 a,b 的详细值是由主调函数在挪用时传送过来的。在{}中的函数体内, 除形参外没有利用其它变量,因此只有语句而没有变量范例说明。 上边这种界说要领称为“传统名目”。 这种名目不易于编译系统查抄,从而会引起一些很是细微并且难于跟踪的错误。ANSI C 的新尺度中把对形参的范例说明归并到形参表中,称为“现代名目”。
譬喻max函数用现代名目可界说为:
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
现代名目在函数界说和函数说明(后头将要先容)时, 给出了形式参数及其范例,在编译时易于对它们举办查错, 从而担保了函数说明和界说的一致性。例1.3即回收了这种现代名目。 在max函数体中的return语句是把a(或b)的值作为函数的值返回给主调函数。有返回值函数中至少应有一个return语句。 在C措施中,一个函数的界说可以放在任意位置, 既可放在主函数main之前,也可放在main之后。譬喻例1.3中界说了一个max 函数,其位置在main之后, 也可以把它放在main之前。
修改后的措施如下所示。
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
void main()
{
int max(int a,int b);
int x,y,z;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z=max(x,y);
printf("maxmum=%d",z);
}
此刻我们可以从函数界说、 函数说明及函数挪用的角度来阐明整个措施,从中进一步相识函数的各类特点。措施的第1行至第5行为max函数界说。进入主函数后,因为筹备挪用max函数,故先对max函数举办说明(措施第8行)。函数界说和函数说明并不是一回事,在后头还要专门接头。 可以看出函数说明与函数界说中的函数头部门沟通,可是末端要加分号。措施第12 行为挪用max函数,并把x,y中的值传送给max的形参a,b。max函数执行的
功效 (a或b)将返回给变量z。最后由主函数输出z的值。
函数挪用的一般形式前面已经说过,在措施中是通过对函数的挪用来执行函数体的,其进程与其它语言的子措施挪用相似。C语言中, 函数挪用的一般形式为:
函数名(实际参数表) 对无参函数挪用时则无实际参数表。 实际参数表中的参数可以是常数,变量或其它结构范例数据及表达式。 各实参之间用逗号脱离。’Next of Page在C语言中,可以用以下几种方法挪用函数:
1.函数表达式
函数作表达式中的一项呈此刻表达式中,以函数返回值参加表达式的运算。这种方法要求函数是有返回值的。譬喻: z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。’Next of Page
2.函数语句
函数挪用的一般形式加上分号即组成函数语句。譬喻: printf ("%D",a);scanf ("%d",&b);都是以函数语句的方法挪用函数。
3.函数实参
函数作为另一个函数挪用的实际参数呈现。 这种环境是把该函数的返回值作为实参举办传送,因此要求该函数必需是有返回值的。譬喻: printf("%d",max(x,y)); 等于把max挪用的返回值又作为printf函数的实参来利用的。在函数挪用中还应该留意的一个问题是求值顺序的问题。 所谓求值顺序是指对实参表中各量是自左至右利用呢,照旧自右至左利用。 对此, 各系统的划定不必然沟通。在3.1.3节先容printf 函数时已提
到过,这里从函数挪用的角度再强调一下。 看例5.2措施。
void main()
{
int i=8;
printf("%d\n%d\n%d\n%d\n",++i,–i,i++,i–);
}
如凭据从右至左的顺序求值。例5.2的运行功效应为:
8
7
7
8
如对printf语句中的++i,–i,i++,i–从左至右求值,功效应为:
9
8
8
9
应出格留意的是,无论是从左至右求值, 照旧自右至左求值,其输出顺序都是稳定的, 即输出顺序老是和实参表中实参的顺序沟通。由于Turbo C现定是自右至左求值,所以功效为8,7,7,8。上述问题如还不领略,上机一试就大白了。函数的参数和函数的值
一、函数的参数
前面已经先容过,函数的参数分为形参和实参两种。 在本小节中,进一步先容形参、实参的特点和两者的干系。 形参呈此刻函数界说中,在整个函数体内都可以利用, 分开该函数则不能利用。实参呈此刻主调函数中,进入被调函数后,实参变量也不能利用。 形参和实参的成果是作数据传送。产生函数挪用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。
#p#分页标题#e#
函数的形参和实参具有以下特点:
1.形参变量只有在被挪用时才分派内存单位,在挪用竣事时, 立刻释放所分派的内存单位。因此,形参只有在函数内部有效。 函数挪用竣事返回主调函数后则不能再利用该形参变量。
2.实参可以是常量、变量、表达式、函数等, 无论实参是何种范例的量,在举办函数挪用时,它们都必需具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等步伐使实参得到确定值。
3.实参和形参在数量上,范例上,顺序上应严格一致, 不然会产生“范例不匹配”的错误。
4.函数挪用中产生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数挪用进程中,形参的值产生改变,而实参中的值不会变革。例5.3可以说明这个问题。
void main()
{
int n;
printf("input number\n");
scanf("%d",&n);
s(n);
printf("n=%d\n",n);
}
int s(int n)
{
int i;
for(i=n-1;i>=1;i–)
n=n+i;
printf("n=%d\n",n);
}
本措施中界说了一个函数s,该函数的成果是求∑ni=1i 的值。在主函数中输入n值,并作为实参,在挪用时传送给s 函数的形参量n( 留意,本例的形参变量和实参变量的标识符都为n, 但这是两个差异的量,各自的浸染域差异)。 在主函数顶用printf 语句输出一次n值,这个n值是实参n的值。在函数s中也用printf 语句输出了一次n值,这个n值是形参最后取得的n值0。从运行环境看,输入n值为100。即实参n的值为100。把此值传给函数s时,形参 n 的初值也为100,在执行函数进程中,形参n的值变为5050。 返回主函数之后,输出实参n的值仍为100。可见实参的值不随形参的变革而变革。