问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

函数调用过程是怎么实现的

发布网友 发布时间:2022-04-26 04:42

我来回答

3个回答

热心网友 时间:2022-06-20 20:52

C程序的基本单元是函数。函数中包含了程序的可执行代码。每个C程序的入口和出口都位于函数main()之中。main()函数可以调用其他函数,这些函数执行完毕后程序的控制又返回到main()函数中,main()函数不能被别的函数所调用。通常我们把这些被调用的函数称为下层(lower-level)函数。函数调用发生时,立即执行被调用的函数,而调用者则进入等待状态,直到被调用函数执行完毕。函数可以有参数和返回值。

程序员一般把函数当作“黑箱”处理,并不关心它内部的实现细节。当然程序员也可以自己开发函数库。
说明一点,函数这一节很重要,可以说一个程序的优劣集中体现在函数上。如果函数使用的恰当,可以让程序看起来有条理,容易看懂。如果函数使用的乱七八糟,或者是没有使用函数,程序就会显得很乱,不仅让别人无法查看,就连自己也容易晕头转向。可以这样说,如果超过100行的程序中没有使用函数,那么这个程序一定很罗嗦(有些绝对,但也是事实)。

一、函数的定义
一个函数包括函数头和语句体两部分。
函数头由下列三不分组成:
函数返回值类型
函数名
参数表
一个完整的函数应该是这样的:
函数返回值类型 函数名(参数表)
{
语句体;
}
函数返回值类型可以是前面说到的某个数据类型、或者是某个数据类型的指针、指向结构的指针、指向数组的指针。指针概念到以后再介绍。
函数名在程序中必须是唯一的,它也遵循标识符命名规则。
参数表可以没有也可以有多个,在函数调用的时候,实际参数将被拷贝到这些变量中。语句体包括局部变量的声明和可执行代码。
我们在前面其实已经接触过函数了,如abs(),sqrt(),我们并不知道它的内部是什么,我们只要会使用它即可。
下面主要介绍无参数无返回值的函数调用。

二、函数的声明和调用
为了调用一个函数,必须事先声明该函数的返回值类型和参数类型,这和使用变量的道理是一样的(有一种可以例外,就是函数的定义在调用之前,下面再讲述)。
看一个简单的例子:
void a(); /*函数声明*/

main()
{
a(); /*函数调用*/
}

void a() /*函数定义*/
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}

在main()的前面声明了一个函数,函数类型是void型,函数名为a,无参数。然后在main()函数里面调用这个函数,该函数的作用很简单,就是输入一个整数然后再显示它。在调用函数之前声明了该函数其实它和下面这个程序的功能是一样的:
main()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}
可以看出,实际上就是把a()函数里面的所有内容直接搬到main()函数里面(注意,这句话不是绝对的。)
我们前面已经说了,当定义在调用之前时,可以不声明函数。所以上面的程序和下面这个也是等价的:
void a()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}

main()
{
a();
}
因为定义在调用之前,所以可以不声明函数,这是因为编译器在编译的时候,已经发现a是一个函数名,是无返回值类型无参数的函数了。

那么很多人也许就会想,那我们何必还要声明这一步呢?我们只要把所有的函数的定义都放在前面不就可以了吗?这种想法是不可取的,一个好的程序员总是在程序的开头声明所有用到的函数和变量,这是为了以后好检查。
前面说了,在调用之前,必须先声明函数,所以下面的做法也是正确的(但在这里我个人并不提倡)。
main()
{
void a();
a();
}

void a()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}

一般来说,比较好的程序书写顺序是,先声明函数,然后写主函数,然后再写那些自定义的函数。
既然main()函数可以调用别的函数,那么我们自己定义的函数能不能再调用其他函数呢?答案是可以的。看下面的例子:

void a();
void b();

main()
{
a();
}

void a()
{
b();
}

void b()
{
int num;
scanf(%d,&num);
printf(%d\n,num);
}

main()函数先调用a()函数,而a()函数又调用b()函数。在C语言里,对调用函数的层数没有严格的*,我们可以往下调用100层、1000层,但是在这里我们并不提倡调用的层数太多(除非是递归),因为层数太多,对以后的检查有一些干扰,函数调过来调过去,容易让自己都晕头转向。
某些人可能就不明白了,看上面的例子,好象使用函数后,程序变的更长了,更不让人理解。当然,我举的这个例子的确没有必要用函数来实现,但是对于某些实际问题,如果不使用函数,会让程序变的很乱,这涉及到参数问题。追问你这答案太坑爹了吧,这么长都是复制的,没点实质内容

追答对啊(是从课件上拷贝下来的)!那你要什么?
函数定义、声明、调用,就是这样啊!
当程序运行到某个节点时,如果发现有函数调用语句(函数要事先声明或者事先定义),程序就自动保存当前程序运行的各个参数、变量到堆栈中去,然后利用所给函数参数调用该函数并运行得出结果,并且将结果保存到内存寄存器中,然后程序自动返回函数调用前的节点处,再将堆栈中的数据出栈,然后再继续运行后面的程序!(其实质就是压栈然后再出栈的操作。当程序检测到有函数调用语句时,自动将汇编语言的中断程序复制到相应的代码段并执行)
这应该是上面内容的高度浓缩啦!其实仔细阅读上面的内容对于理解函数调用很有用!

热心网友 时间:2022-06-20 20:52

其实就是压栈弹栈的问题。

热心网友 时间:2022-06-20 20:53

你是指什么语言追问啥语言都一样啊。。我是想问怎么保存状态,怎么压栈,怎么返回原函数

追答要有语言才能对症下药,像e,pascal,vbs调用又不一样

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
重磅|8月1日起 报关单的填法将重大改变 进出口权需要报关员么 宝宝被莫名的虫子咬了又红又肿又痒怎么? 北京疫情个为数是什么意思? 在做刀伤的手术时没有接上神经是医院的过错吗? 手术室收费项目有哪些 手术室的秘密:一台10万的手术,主刀医生拿多少?答案颠覆你的认知 阿里巴巴中修改产品信息只修改一小部分行吗?谢谢 可否给我一个阿里巴巴的序列号~谢谢了 阿里巴巴店铺产品搜索框代码谁有呢,给我发一下谢谢了! C++函数不可以调用自己么? Matlab 函数中怎么调用自身,进行自循环? js自定义函数调用自定义函数 C语言中,函数是否可以直接或间接调用自己!!求大神!!求解析!!! matlab 如何建立、调用自定义函数? excel中能不能输入一个函数,按表格中给定的数据自动调整行高喃? Matlab中函数怎样调用自定义函数 为什么再次调用JavaScript函数时,自调函数只执行一次?counter为什么不归... c语言递归算法,主函数main能自调吗? php 函数自调用问题 javascript函数怎么自己调用自己啊? excel自定义函数怎么调用自定义函数 js中的自调用函数 Js编程语言中,自调用函数是什么?举个Js代码例子解释一下! C语言中函数怎么自己调用自己 淘宝新品标题怎么写?有什么主意事项? 淘宝如何写宝贝标题 小标题大学问,淘宝标题该怎么写 淘宝店铺怎么写标题 欢迎光临小店哦 华为mate40出来有没有人买? 抚州临川新天地最新房价?商业贷款多少少利息 江西房贷利率最新消息2022 抚州市2015年9月份公积金贷款利率是多少我公积金贷款25万,贷款年限12年,请问每月还房贷要多 解冻不了,人脸识别不通过怎么办? 怎么将word表格的外边框设置为蓝色1.5磅,内边框设置为蓝色1磅 word中的表格有两条边框,外边框要粗一些,内边框细一些是怎么设置的 中国舞蹈家协会考级第九级有那些(最新版) 中国舞考级最高级是几级! 中国舞蹈考级九级分割练习采用了什么音乐?音乐叫什么? 中国舞最高可以考到几级? 少儿舞蹈考级可以直接报考三级或四级吗 每年的中国舞考级在几月? 中国舞等级考试第九级去哪学? 女儿17中国舞考9级需要考十级吗 中国舞九级有哪几个组合 北京舞蹈学院中国舞考级 我是一直从事舞蹈表演的,能否不考一到六级,我可以直接考七级以上吗? 想解除某个电话号码的《拉黑》该如何操作? 如何记好英语笔记 英语笔记应该怎么做 如何有效的做英语笔记