gpt4 book ai didi

c - 没有递归调用的递归?

转载 作者:IT王子 更新时间:2023-10-29 00:18:17 25 4
gpt4 key购买 nike

在/prog/上找到这个。我实际上使用了 GDB,是的,它确实是一个递归。但它是如何发生的?

// This works on 32-bit x86 Linux with gcc as long as you don't enable optimization.

#include <stdio.h>
#include <stdlib.h>

static void factorial(int in, int *out)
{
*(&in-1)-=5-5*(1/in);
*out*=in--;
}

int main(int argc, char **argv)
{
int result=1;
int number=0;

if (argc!=2)
exit(1);

number=atoi(argv[1]);
if (number<1)
exit(2);

factorial(number, &result);
printf("%d! = %d\n", number, result);
return 0;
}


$ ./factorial 3
3! = 6

$ ./factorial 5
5! = 120

最佳答案

甜甜的。 ;)

这是非常不可移植的代码,只能在 x86 上运行。它正在做的是更改堆栈上的返回地址,以便如果 in>1,该函数不会返回 following call 指令,而是调用指令本身。 x86 上的调用指令是五个字节(一个操作码加上调用目标的 4 字节地址),因此需要从返回地址中减去五。

这个

*(&in-1)-=5-5*(1/in);

只是一种混淆的说法

if(in>1)
*(&in-1)-=5;

&in-1 是返回地址在堆栈中的位置。

关于c - 没有递归调用的递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com