c语言函数的return谁能仔细给我解释一下?

比如这串代码,return 3和return p是怎么执行的?什么时候执行的?为什么输出结果是7?

事实上 无论是return ; 还是return X;

在汇编上都只有一条指令:ret(retn)

只不过对于return X; 会在 执行ret指令之前对eax寄存器赋值:

如果是return 0 ; 可能编译器会这样做:

xor eax,eax

ret

其他情况类似


然后从C语言角度讲

对于返回类型为void的函数

函数体内可以出现return;语句来表示结束本函数的执行 

这个时候eax还是有值的,因为 函数返回类型是void,因此在调用该函数的地方不可能会去用该函数的返回值,也就意味着该返回值是毫无意义的


楼主想问的 单独的return;语句,对于这行代码,一般只用在返回类型为void的函数体内

若出现在非void返回类型的函数体内,那么返回值是隐含在寄存器eax中的


然后对于有返回值的函数来说

return后面是肯定需要跟一个值的

这个值是被送入寄存器eax带出来的~

我说再多 也许还是会有人不信(本人玩逆向的,这一切信不信那是你们的事,我只能把事实告诉你们,我也只能做到这样了)

下面直接上代码上图:

(微软任何C/C++编译器、VC/VS这些、都支持编译此代码,没有警告,没有错误)


注:主函数不主函数的return都是没有区别的

但是main函数很特别,特别在它有好多种写法,标准C真正的主函数返回类型是int

有2个参数,一个是命令行参数个数,一个是命令行参数

windows下面的主函数可以有三个参数,前两个参数跟标准C一样,第三个参数是环境变量

这些参数都是由mainCRTStartup函数传进来的,而mainCRTStartup再往上你还要研究的话那。。。。那。。。那。。。我只能告诉你这些参数都是要操作系统传进来的吧~~~

我们编程的时候,也许有些菜鸟会把main写成如下形式:void main()

其实这种写法在编译之后都是会被转化成标准写法的底楼说的 不带返回值系统默认返回0这完全是不靠谱的,因为事实当中返回值都是被寄存器eax带出去的,而对于main是必须要返回值的,菜鸟写了没返回值的main在编译之前就被编译器替换掉了,哪来的默认返回0的说法?何来默认?系统会把你写的main换成 标准main形式!标准main会在底下返回0

主函数return的值只有你在其他进程中创建子进程,子进程的返回状态被父进程接收的值就是main的返回值,所以,在你写的程序不需要被其他进程创建的话,main的返回值是无关紧要的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-10
这是递归调用,func(9)的执行流程如下:

第一步:执行func(9),p=9-func(7)
第二步:执行func(7),p=7-func(5)
第三步:执行func(5),p=5-func(3)
第四步:执行func(3),p=3-func(1)
第五步:执行func(1),由于参数x小于2,结束递归,return 3
返回第四步:p=3-3=0
返回第三步:p=5-0=5
返回第二步:p=7-5=2
返回第一步:p=9-2=7
最后return p
所以最终输出结果为7追问

返回第三到第一步那看不懂了,为什么是5-0,7-5和9-2?

追答

因为第五步的func(1)=3

所以返回第四步时,p=3-func(1)=3-3=0,而p是func(3)的返回值,所以func(3)=0

所以返回第三步时,p=5-func(3)=5-0=5,而p是func(5)的返回值,所以func(5)=5

所以返回第二步时,p=7-func(5)=7-5=2,而p是func(7)的返回值,所以func(7)=2

所以返回第一步时,p=9-func(7)=9-2=7,而p是func(9)的返回值,所以func(9)=7

所以func(9)的值是7

追问

return 3是把3给x吗?如果是给x那为什么func(x-2)变成func(1)之后不会return 3一直循环呢?

追答

return 3是把3返回给func(1),它执行后函数就提前结束了,后面的p=x-func(x-2)就不再执行了,所以不会出现你说的那种情况的。

追问

感觉步骤少还可以这样一步一步看,如果是return 100这种怎么办啊

追答

你搞清楚什么是递归调用就不需要这样一步步看了,否则编程序都要这样做的话那还编啥,人工自己来呗。

本回答被提问者采纳
第2个回答  2019-12-23
递归千万别纠结过程,一旦纠结你就输了。
递归有两个关键要素,做好这两点就够了。一个是递归规则,可以理解为数列的通项,另一个就是终止条件,可以理解为首项。在写函数时候注意好递归规则和终止条件的关系就可以了。
第3个回答  2021-03-16

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网