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

标签 c++ recursion

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

相关文章:

c++ - 内存中的多维数组

c++ - 如何在 `QQmlApplicationEngine` 派生类中访问 `QQuickItem` 的对象?

c - 骑士之旅- 给定 n 步,骑士在 n 步中有多少种选择可以从 (1,1) 移动到 (8,8)?

recursion - 重入和递归

c - 检查字符串是否为 "Balanced"的递归函数

C++线程安全——读图

c++ - 获取插入的USB设备信息

c++ - 在一行中初始化一对 vector

c++ - 使用递归方法反转ifstream输入

javascript - Angular : Async push to recursively generated array