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。上述成绩如还不明白,上机一试就明确了。函数的参数和函数的值
一、函数的参数
  前面已经引见过,函数的参数分为形参和实参两种。 在本小节中,进一步引见形参、实参的特点和两者的相干。 形参出现在函数界说中,在整个函数体内都可以使用, 分开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的听命是作数据传送。孕育发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而完成主调函数向被调函数的数据传送。

  函数的形参和实参具有以下特点:
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。可见实参的值不随形参的变化而变化。



版权声明: 原创作品,答应转载,转载时请务必以超链接情势标明文章 原始出处 、作者信息和本声明。不然将追究法令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975603.html