有人向我展示了一个演示递归的示例程序,它看起来不应该工作但确实有效。逻辑很清楚,但为什么即使没有返回递归函数调用,它也能工作?似乎 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/41091123/