鱼C论坛

 找回密码
 立即注册
查看: 2949|回复: 30

[已解决]看图回答C语言基础问题!!有效回答可获得50鱼币!!

[复制链接]
发表于 2023-3-23 03:24:37 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 Runpire 于 2023-3-23 19:29 编辑

以下代码结果是:先输出了 if 内部函数执行的结果(5432100),
        函数执行完 n = 0
为什么 if 下面的输出语句还能从 0 执行 5 次自增输出结果为 (0 1 2 3 4)呢 ???
是否因为递归的出栈入栈是先进后出的原则 ???

1.png 2.png
最佳答案
2023-3-23 03:24:38
你递归一层一层往里进完之后还是要一层一层往外出的

每次执行完 up_and_down(--n) 并不会直接drop掉下面的printf,而是等 if条件 不满足开始往外解递归的时候一层一层执行

假设现在到了最底层 n=0 了,那么 if条件 不满足,下面的printf打印一个0
然后往回退一层,n=1,但是由于执行了 up_and_down(--n) ,所以到下面那个printf的时候n=0了,所以再打印0
然后再往回退一层,n=2,同样因为执行了 up_and_down(--n) ,所以到下面prinf的时候n就=1了,所以打印1
以此类推......
直到退回最外层,n=5,由于 up_and_down(--n) ,所以打印4
然后递归结束返回main然后return 0

最佳答案

查看完整内容

你递归一层一层往里进完之后还是要一层一层往外出的 每次执行完 up_and_down(--n) 并不会直接drop掉下面的printf,而是等 if条件 不满足开始往外解递归的时候一层一层执行 假设现在到了最底层 n=0 了,那么 if条件 不满足,下面的printf打印一个0 然后往回退一层,n=1,但是由于执行了 up_and_down(--n) ,所以到下面那个printf的时候n=0了,所以再打印0 然后再往回退一层,n=2,同样因为执行了 up_and_down(--n) ,所以到 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 03:24:38 | 显示全部楼层    本楼为最佳答案   
你递归一层一层往里进完之后还是要一层一层往外出的

每次执行完 up_and_down(--n) 并不会直接drop掉下面的printf,而是等 if条件 不满足开始往外解递归的时候一层一层执行

假设现在到了最底层 n=0 了,那么 if条件 不满足,下面的printf打印一个0
然后往回退一层,n=1,但是由于执行了 up_and_down(--n) ,所以到下面那个printf的时候n=0了,所以再打印0
然后再往回退一层,n=2,同样因为执行了 up_and_down(--n) ,所以到下面prinf的时候n就=1了,所以打印1
以此类推......
直到退回最外层,n=5,由于 up_and_down(--n) ,所以打印4
然后递归结束返回main然后return 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 08:12:22 | 显示全部楼层
1、首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
3、省略中间的输出到输出1
4、输出1之后,1>0,调用函数
5、输出0,此时不执行if里面调用函数的 语句 ,执行下面的输出制表符的语句,再次输出0,此次函数调用结束
6、第4条里面n为1的if语句执行完毕。执行下面有制表符的输出,输出 1 ,函数调用结束
7、第六条里面 n 为1 的函数是前一次 n 为2 时 的函数 调用 , 结束调用之后 执行if下面的语句 ,此时 输出 带有制表符的2
8、依次类推
注:这个里面if不会中断,只是将带制表符的输出延后了,函数结束后依然会调用

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Runpire + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 10:56:31 | 显示全部楼层
if只是一个判断,它的结果是否成立只影响if{语句块}之内的内容是否被执行,不会影响if{}之后的语句
23.png

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Runpire + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 15:26:18 | 显示全部楼层
两手空空儿 发表于 2023-3-23 10:56
if只是一个判断,它的结果是否成立只影响if{语句块}之内的内容是否被执行,不会影响if{}之后的语句

返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不是 43210的输出呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 15:26:37 | 显示全部楼层
小怪兽@ 发表于 2023-3-23 08:12
1、首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...

返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不是 43210的输出呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 15:32:05 From FishC Mobile | 显示全部楼层
先用调试器跟踪一遍执行过程试试吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 16:05:25 | 显示全部楼层
dolly_yos2 发表于 2023-3-23 15:32
先用调试器跟踪一遍执行过程试试吧

没听明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 17:36:58 | 显示全部楼层
首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...
3、省略中间的输出到输出1
4、输出1之后,1>0,调用函数
5、输出0,此时不执行if里面调用函数的 语句 ,执行下面的输出制表符的语句,再次输出0,此次函数调用结束
6、第4条里面n为1的if语句执行完毕。执行下面有制表符的输出,输出 1 ,函数调用结束
7、第六条里面 n 为1 的函数是前一次 n 为2 时 的函数 调用 , 结束调用之后 执行if下面的语句 ,此时 输出 带有制表符的2
8、依次类推
注:这个里面if不会中断,只是将带制表符的输出延后了,函数结束后依然会调用
这个我是问的我的c语言老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 18:04:30 | 显示全部楼层
Runpire 发表于 2023-3-23 15:26
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不 ...

你在主函数里是将5传入后调用的函数,这是第一次调用函数,先输出5,然后if语句里才依次 --n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:20:16 | 显示全部楼层
芜湖666 发表于 2023-3-23 17:36
首先传入5,判断后5>0 , 5减一变为4的参数再次调用函数
2、输出4之后调用函数
...

亲,你这回答跟一楼的没什么区别呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:21:34 | 显示全部楼层
小怪兽@ 发表于 2023-3-23 18:04
你在主函数里是将5传入后调用的函数,这是第一次调用函数,先输出5,然后if语句里才依次 --n

这个我知道,我是不太明白 if 下面的输出可以自增而且是5次,这是递归的规律是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 18:24:13 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-3-23 18:27 编辑
Runpire 发表于 2023-3-23 15:26
返回过程是原理就是会返回输出n个数字吗,
printf("%d\t",n);
在if后面被延后输出,为什么输入5函数不 ...


你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);  这个是你让它输出的,不是返回产生输出,删掉这一句就没有后面的输出了

你要先想清楚程序执行的路线,它是只会向一个方向走的,不会走回头路(除非你直接jump回去)
函数A调用一个函数B,B执行完就会返回到函数A,继续执行A后面还没有被执行的语句
在进入B之前要先保存A内的数据(这里示例保存了n,push(n))    //调用前保护现场
B执行完回到A,在执行A内的语句前要恢复原来的数据(pop(n))    //返回后恢复现场
然后开始执行A剩下的语句

你注意一下我写的{}和缩进,看一下层次,你先把它想成一个普通函数调用,再理解这里的递归调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:45:20 | 显示全部楼层
经过找了个朋友一步步帮我分析,虽然还是会有点迷惑,可能是因为没有代码的流程图,笨笨的脑袋但看思路一时间转不过来,这是我的缺点,我会慢慢进步的,非常谢谢大家的解答,对我的启发也非常有效,下面是我自己进行的思路推导,还麻烦大家帮我看看,是否这样去想是对的
int main 调用函数然后到函数内
函数内输出5后判断n大于0后,执行n=n-1=4 并且再次调用函数,
        以此内推输出:5 4 3 2 1 0
        到 0 的时候if不成立就输出下面的printf再次输出 0
        所以输出会为:5 '\n' 4 '\n' 3 '\n' 2 '\n' 1 '\n' 0 '\n' 0 '\t'
if 下面的printf被延迟执行了5次,所以会从 n = 0 开始执行回调5次
输出就为:0 '\t' 1 '\t' 2 '\t' 3 '\t' 4

所以整个输出就会
5 '\n' 4 '\n' 3 '\n' 2 '\n' 1 '\n' 0 '\n' 0 '\t' 0 '\t' 1 '\t' 2 '\t' 3 '\t' 4

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:50:08 | 显示全部楼层
两手空空儿 发表于 2023-3-23 18:24
你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);  这个是你让它输出的,不是返回产生 ...

对,我明白5432100的输出,我是不明白它为什么可以又调用5次 if 下面的 输出,是因为if内部调用了函数5次的原因吗,所以外部也会进行相对应的次数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:57:46 | 显示全部楼层
两手空空儿 发表于 2023-3-23 18:24
你的说法就不太对,我说的返回是子程序的返回
printf("%d\t",n);  这个是你让它输出的,不是返回产生 ...

if 内部的函数结束后 n 是 0 的,再执行if下面的语句n也是从0开始,这里我都理解,我是不理解它为什么还可以从0 一直自增1(5次)
然后看完你说的保护现场和恢复现场,我理解成 if 和 if下面的语句不是同时进行的,编译从上到下一条线的规则,是否就是 if 内部 执行了函数使if执行 了5次,所以和if同级的语句也会被执行输出5次,然后以入栈和出栈的思维,先进后出,所以就形成了 01234   而不是 43210
你看看我这样想是否可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 19:40:42 | 显示全部楼层
水贴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 20:57:43 | 显示全部楼层
Runpire 发表于 2023-3-23 18:20
亲,你这回答跟一楼的没什么区别呀

等明天问一下我的c语言老师吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-23 21:08:37 | 显示全部楼层
芜湖666 发表于 2023-3-23 20:57
等明天问一下我的c语言老师吧

我觉得你不如直接问gpt
我觉得gpt的回答不见的会比你的老师的回答差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 22:08:40 | 显示全部楼层
人造人 发表于 2023-3-23 21:08
我觉得你不如直接问gpt
我觉得gpt的回答不见的会比你的老师的回答差

gtp 让我想起了今天白天看到的一篇文章,ChatGTP 要取代程序员了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表