友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
c语言设计-第13部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
return 表达式;
或者为:
return (表达式);
该语句的功能是计算表达式的值,并返回给主调函数。在函数中允许有多个 return
语句,但每次调用只能有一个 return 语句被执行,因此只能返回一个函数值。
2) 函数值的类型和函数定义中函数的类型应保持一致。如果两者不一致,则以函数类
型为准,自动进行类型转换。
3) 如函数值为整型,在函数定义时可以省去类型说明。
4) 不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”。如例
8。2 中函数 s 并不向主函数返函数值,因此可定义为:
void s(int n)
{ ……
}
一旦函数被定义为空类型后,就不能在主调函数中使用被调函数的函数值了。
例如,在定义 s 为空类型后,在主函数中写下述语句
sum=s(n);
就是错误的。
为了使程序有良好的可读性并减少出错, 凡不要求返回值的函数都应定义为
空类型。
8。4 函数的调用
谭浩强 C 语言程序设计 2001 年 5 月 1 日
8。4。1 函数调用的一般形式
前面已经说过,在程序中是通过对函数的调用来执行函数体的,其过程与其它语言的子
程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数,变量或其它构造
类型数据及表达式。各实参之间用逗号分隔。
8。4。2 函数调用的方式
在C语言中,可以用以下几种方式调用函数:
1。 函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运
算。这种方式要求函数是有返回值的。例如:z=max(x;y)是一个赋值表达式,把 max
的返回值赋予变量 z。
2。 函 数 语 句 : 函 数 调 用 的 一 般 形 式 加 上 分 号 即 构 成 函 数 语 句 。 例 如 : printf
(〃%d〃;a);scanf (〃%d〃;&b);都是以函数语句的方式调用函数。
3。 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作
为 实 参 进 行 传 送 , 因 此 要 求 该 函 数 必 须 是 有 返 回 值 的 。 例 如 :
printf(〃%d〃;max(x;y)); 即是把 max 调用的返回值又作为 printf 函数的实参来使
用的。在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实
参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。
介绍 printf 函数时已提到过,这里从函数调用的角度再强调一下。
【例 8。3】
main()
{
int i=8;
printf(〃%dn%dn%dn%dn〃;++i;……i;i++;i……);
}
如按照从右至左的顺序求值。运行结果应为:
8
7
7
8
如对 printf 语句中的++i,……i,i++,i……从左至右求值,结果应为:
9
8
8
9
谭浩强 C 语言程序设计 2001 年 5 月 1 日
应特别注意的是,无论是从左至右求值, 还是自右至左求值,其输出顺序都是不变的,
即输出顺序总是和实参表中实参的顺序相同。由于 Turbo C 现定是自右至左求值,所以结果
为 8,7,7,8。上述问题如还不理解,上机一试就明白了。
8。4。3 被调用函数的声明和函数原型
在主调函数中调用某函数之前应对该被调函数进行说明(声明),这与使用变量之前要
先进行变量说明是一样的。在主调函数中对被调函数作说明的目的是使编译系统知道被调函
数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。
其一般形式为:
类型说明符 被调函数名(类型 形参,类型 形参…);
或为:
类型说明符 被调函数名(类型,类型…);
括号内给出了形参的类型和形参名,或只给出形参类型。这便于编译系统进行检错,以
防止可能出现的错误。
例 8。1 main 函数中对 max 函数的说明为:
int max(int a;int b);
或写为:
int max(int;int);
C语言中又规定在以下几种情况时可以省去主调函数中对被调函数的函数说明。
1) 如果被调函数的返回值是整型或字符型时,可以不对被调函数作说明,而直接调用。
这时系统将自动对被调函数返回值按整型处理。例 8。2 的主函数中未对函数 s 作说
明而直接调用即属此种情形。
2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数
再作说明而直接调用。例如例 8。1 中,函数 max 的定义放在 main 函数之前,因此
可在 main 函数中省去对 max 函数的函数说明 int max(int a;int b)。
3) 如在所有函数定义之前,在函数外预先说明了各个函数的类型,则在以后的各主调
函数中,可不再对被调函数作说明。例如:
char str(int a);
float f(float b);
main()
{
……
}
char str(int a)
{
……
}
float f(float b)
{
……
}
其中第一,二行对 str 函数和 f 函数预先作了说明。因此在以后各函数中无须对
谭浩强 C 语言程序设计 2001 年 5 月 1 日
str 和 f 函数再作说明就可直接调用。
4) 对库函数的调用不需要再作说明,但必须把该函数的头文件用 include 命令包含在
源文件前部。
8。5 函数的嵌套调用
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下
一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出
现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形
是类似的。其关系可表示如图。
图表示了两层嵌套的情形。其执行过程是:执行 main 函数中调用 a 函数的语句时,即
转去执行 a 函数,在 a 函数中调用 b 函数时,又转去执行 b 函数,b 函数执行完毕返回 a
函数的断点继续执行,a 函数执行完毕返回 main 函数的断点继续执行。
2
【例 8。4】计算s=2 !+32!
本题可编写两个函数,一个是用来计算平方值的函数 f1,另一个是用来计算阶乘值的
函数 f2。主函数先调 f1 计算出平方值,再在 f1 中以平方值为实参,调用 f2 计算其阶乘值,
然后返回 f1,再返回主函数,在循环程序中计算累加和。
long f1(int p)
{
int k;
long r;
long f2(int);
k=p*p;
r=f2(k);
return r;
}
long f2(int q)
{
long c=1;
int i;
for(i=1;i0)
printf(〃%d 〃;v);
else
printf(〃%d 〃;0);
}
main()
{
int a'5';i;
printf(〃input 5 numbersn〃);
for(i=0;i
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!