【问题标题】:Why does this recursive function return the correct value? [duplicate]为什么这个递归函数返回正确的值? [复制]
【发布时间】:2018-10-19 03:33:22
【问题描述】:

运行一个递归函数,例如这个(在 gcc 7.3.1 中编译):

#include <stdio.h>

int arr[] = {5,1,2,6,7,3};
int arraySize = 6;

int recfind(int value, int index)
{
    if (arr[index] == value)
        return 1;
    if (index >= arraySize)
        return 0;
    // return recfind(value, ++index);
    recfind(value, ++index);
 }

int main() {
    printf("found 6? %d\n", recfind(6, 0));
    printf("found 9? %d\n", recfind(9, 0));
}

我得到以下输出:

found 6? 1
found 9? 0

为什么会这样?既然没有返回递归recfind调用的结果,那么高层调用的返回值如何选择呢?

【问题讨论】:

  • 函数被指定返回一些东西,但没有。你不知道你怎么能摆脱它吗?不管结果如何?
  • @StoryTeller 是的,这正是我想知道的。
  • 试图讨论undefined behavior的行为是没有意义的。
  • 您的编译器应该对此发出警告。

标签: c recursion return return-value


【解决方案1】:

对于 C 部分是来自 N1256 的 6.9.1:

如果到达终止函数的},并且 函数调用被调用者使用,行为未定义。

所以你的程序的行为是undefined

为什么会这样?

您使用的目标 + 编译器有可能不会篡改包含上次(递归)函数调用的返回值的寄存器。 C 不强制要求这种机制在规范中返回值。

因此,虽然这听起来很合理,但并不能保证。

【讨论】:

  • 这个问题没有问到C++。
  • @aschepler 它被标记为 C/C++。
  • @aschepler 确实,我不确定它是 C 还是 C++ 是否会对此有任何影响(如果确实如此,我会对那个轴承到底是什么感兴趣)
  • @gandalf3 在 C 函数中按值返回可能不会返回只要调用者不使用返回值。在 C++ 中,调用者是否使用返回值并不重要,如果函数没有返回,则行为未定义。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2018-09-03
  • 2015-03-21
  • 2022-12-06
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多