L_gxu 发表于 2023-3-23 22:26:40

你这是个函数的嵌套。
1.后面输出的001234不是递增。你定义的函数up_and_down(int n)里的参数n是个局部变量,只在这个函数范围内有效。
2.你这个程序每次调用这个嵌套函数的时候,参数n都会被分配一个动态存储地址。函数没执行完,存储空间也不会释放。
3.最内部的嵌套函数执行完,才会一层层的执行外部函数的剩余部分。对这个程序来说,就是if后面的输出。
4.总之,程序执行参数看的是地址,不是参数的名字,虽然每层变量名都定义的n,但实际不是一个存储地址。

人造人 发表于 2023-3-23 22:37:32

Runpire 发表于 2023-3-23 22:08
gtp 让我想起了今天白天看到的一篇文章,ChatGTP 要取代程序员了

那么我们能够/或者说需要做些什么吗?
我不知道,也许时间会给我们一个答案吧

L_gxu 发表于 2023-3-23 22:37:46

L_gxu 发表于 2023-3-23 22:26
你这是个函数的嵌套。
1.后面输出的001234不是递增。你定义的函数up_and_down(int n)里的参数n是个局部变 ...

简单来说,你这个程序虽然多次调用同一个函数。但内部函数的执行过程,没有影响到外部函数的参数值。主要原因就是这些参数不是同一个存储地址。进入if执行--n后n是多大,执行完if后printf时n还是多大。

Runpire 发表于 2023-3-23 23:39:50

1.后面输出的001234不是递增。你定义的函数up_and_down(int n)里的参数n是个局部变量,只在这个函数范围内有效。
    这个我理解,
2.你这个程序每次调用这个嵌套函数的时候,参数n都会被分配一个动态存储地址。函数没执行完,存储空间也不会释放。
    那是不是就是第一句输出 5 后判断执行函数输出 4 3 2 1 ,等于 0 的时候不执行 if内部的函数往下执行了 if 下面的语句输出 0
3.最内部的嵌套函数执行完,才会一层层的执行外部函数的剩余部分。对这个程序来说,就是if后面的输出。
    内部取值的顺序是 n = 4 3 2 1 0 ,外部对应的层是 n = 0 1 2 3 4这个意思吗
4.总之,程序执行参数看的是地址,不是参数的名字,虽然每层变量名都定义的n,但实际不是一个存储地址。
   那是不是就是可以理解为 如:内部存放 n = 0 的地址 , 外部存放的是 4
{:10_266:}我不太明白的就是 if 后的语句执行的次数是跟着内部次数一起执行了,只是延迟了输出是吗;那为什么内部顺跟外部却反过来了

Runpire 发表于 2023-3-23 23:41:17

L_gxu 发表于 2023-3-23 22:37
简单来说,你这个程序虽然多次调用同一个函数。但内部函数的执行过程,没有影响到外部函数的参数值。主要 ...

大哥!!我回复啦!!麻烦你看下帖子 ,我忘记按回复输入了{:10_285:}

L_gxu 发表于 2023-3-24 01:43:15

Runpire 发表于 2023-3-23 23:39
1.后面输出的001234不是递增。你定义的函数up_and_down(int n)里的参数n是个局部变量,只在这个函数范围内 ...

不是延迟了输出,而是对应语句压根还没有执行呢。
我简单描述一下程序逻辑吧。
1.输入5。这里用的参数是n,我用n0代替吧。5存到了n0的地址。
2.调用up_and_down(n0),第一次进入函数后,参数用n1代替,注意n1和n0的存储空间不是同一个地址,调用函数的时候,实际相当于把n0的值5赋给了n1,然后printf了n1的值5,接着判断if条件(5>0),第二次调用up_and_down(n1)前,执行--n,n1变成了4。注意现在程序在if里面呢,if后面的printf没有执行!
3.第二次调用up_and_down(n1)后,进入函数,参数用n2代替,n2的存储地址和n0,n1都不是同一个。同理,是n1的值4赋给了n2。然后printf了n2的值4,接着判断if条件(4>0),执行--n,n2变成了3。接着第三次调用up_and_down(n2)。同样,这个if后面的printf语句也没有执行!
4.同理,第三次调用up_and_down(n2)。n2的值3赋给n3。然后printf了n3的值3,接着判断if(3>0),执行--n,n3变成了2。
5.同理,第四次调用up_and_down(n3)。n3的值2赋给n4。然后printf了n4的值2,接着判断if(2>0),执行--n,n4变成了1。
6.同理,第五次调用up_and_down(n4)。n4的值1赋给n5。然后printf了n5的值1,接着判断if(1>0),执行--n,n5变成了0。
7.第六次调用up_and_down(n5)。n5的值0赋给n6。然后printf了n6的值0,接着判断if(0>0),结果false。不进入if语句了,然后这里才第一次执行if后面的printf语句,打印的是n6的值也就是0。执行完printf后,这一层嵌套的函数也就执行完了,再执行外面的一层函数。
8.然后,依次执行外面的每层函数。从程序来看,也就是依次执行printf语句,打印n5的值0,n4的值1,n3的值2,n2的值3,n1的值4。这也就形成了你所谓递增的效果。
9.return 0 程序执行完。
10.n0,n1,n2,n3,n4,n5,n6的存储地址是动态分配的,各不相同。执行对应层的函数后,会释放相应的空间。

Runpire 发表于 2023-3-24 01:58:55

虚无→与→飘渺 发表于 2023-3-23 23:49
你递归一层一层往里进完之后还是要一层一层往外出的

每次执行完 up_and_down(--n) 并不会直接drop掉下面 ...

你这么说,我倒是有点明白了

Runpire 发表于 2023-3-24 02:25:18

L_gxu 发表于 2023-3-24 01:43
不是延迟了输出,而是对应语句压根还没有执行呢。
我简单描述一下程序逻辑吧。
1.输入5。这里用的参数 ...

不过我仔细的看了下你的解答,1-7 我是原本就知道的,我想详细的知道下执行外面一层函数为什么依次执行不是 n1 (它是内部执行的第一个)开始,而是从 n5 (内部的最后一个)开始

芜湖666 发表于 2023-3-24 09:41:48

Runpire 发表于 2023-3-23 22:08
gtp 让我想起了今天白天看到的一篇文章,ChatGTP 要取代程序员了

那我等会发手机就用

两手空空儿 发表于 2023-3-24 15:16:45

你先理解一下什么是程序调用
把你自己当作CPU,我们同一时间内只能干一件事,CPU也是
1、假设你在自己的房间里写作业,共10份,每份写之前你都要看一下要不要今天写(相当于一个if判断),当你写到第3份的某道题的时候,你需要去你妈妈房间电脑里查资料才能接着写,这时你要把没有完成的中间结果保存起来,一会儿回来接着用
2、然后你来到你妈妈房间查资料(程序调用),经过一翻折腾,原理啊,公式啊,这里你都查到了,带着这些你查到的东西(程序返回值)回你的房间(程序返回)
3、回到自己房间,拿出原来的中间结果,继续写作业,一直到把要完成的都完成,程序结束。
我只说了一次调用的过程,但是在这10份作业里可能会产生1万次的调用,如果每一次的调用里都有一个printf,那就要在调用的过程中输出一万次(在你妈妈的房间里输出),如果调用里一个printf都没有,调用过程就不会产生任何输出。
你的程序是main调用up_and_down,up_and_down再调用up_and_down。。。。。递归调用会让人混乱,
你就把它想成不是调用自己,调用多少次就有多少个子程序,main调用up_and_down,up_and_down再调用up_and_down1,up_and_down1再调用up_and_down2。。。。。这样可能会帮助你理解一些

别管什么if语句延迟不延迟的,这个说法本身就有问题,前面加一句随便什么代码,后面的语句就要比原来晚一句被执行,但是非管这个叫延迟好像是不合适的

Runpire 发表于 2023-3-26 01:27:50

两手空空儿 发表于 2023-3-24 15:16
你先理解一下什么是程序调用
把你自己当作CPU,我们同一时间内只能干一件事,CPU也是
1、假设你在自己的 ...

真的是更加理解了!谢谢大哥!{:10_254:}
页: 1 [2]
查看完整版本: 看图回答C语言基础问题!!有效回答可获得50鱼币!!