gpt4 book ai didi

c++ - 为什么递归返回调用会在没有显式返回语句的情况下跳出堆栈?

转载 作者:太空狗 更新时间:2023-10-29 23:15:30 24 4
gpt4 key购买 nike

有人向我展示了一个演示递归的示例程序,它看起来不应该工作但确实有效。逻辑很清楚,但为什么即使没有返回递归函数调用,它也能工作?似乎 return 命令从堆栈中跳出,即使它没有被请求。这是语言标准还是 gcc 的东西?我在 Windows 和 Linux 上用 gcc 编译的 C 和 C++ 看到了它。

#include <iostream>
#include <cstdlib>

using namespace std;

int isprime(int num, int i)
{
if (i == 1) {
return 1;
}
else {
if (num % i == 0)
return 0;
else
isprime(num, i-1); // should be returned
}
}


int main(int argc, char** argv)
{
int input = atoi(argv[1]);
cout << input << "\t" << isprime(input, input/2) << "\n";
}

最佳答案

只有当返回值意外地出现在调用者期望的寄存器中时,这样的事情才会起作用。这仅在您的编译器将其实现为递归函数时才有效。从技术上讲,使用未提供返回值的函数的返回值是未定义的行为

编辑:在现代架构中,函数的返回值可能会在特定的硬件寄存器中传递。当你递归调用你的函数时,在所有情况下硬件寄存器都设置为期望值。如果偶然从递归中弹出硬件寄存器从未更改过,您最终会得到正确的值。

如果返回值被放置在(递归)调用者堆栈的某个位置,那么所有这些模式都不起作用。

无论如何,所有这些都应该被任何现代编译器捕获并给你一个警告。如果不是,则您没有好的编译器,或者您使用的命令行选项过于防御。

除夕特别事件:在现实世界中,像这样的代码(带有 return)甚至不会实现为递归函数。无需太多努力,您就会找到该函数的迭代变体,如果您要求最大优化,任何现代体面的编译器也应该能够找到它。

关于c++ - 为什么递归返回调用会在没有显式返回语句的情况下跳出堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28887837/

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