为啥这个递归函数返回正确的值? [复制]
Posted
技术标签:
【中文标题】为啥这个递归函数返回正确的值? [复制]【英文标题】: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的行为是没有意义的。 您的编译器应该对此发出警告。 这是高度相关的***.com/questions/9936011/… 【参考方案1】:对于 C 部分是来自 N1256 的 6.9.1:
如果到达终止函数的,并且 函数调用被调用者使用,行为未定义。
所以你的程序的行为是undefined。
为什么会这样?
您使用的目标 + 编译器有可能不会篡改包含上次(递归)函数调用的返回值的寄存器。 C 不强制要求这种机制在规范中返回值。
因此,虽然这听起来很合理,但并不能保证。
【讨论】:
这个问题没有问到C++。 @aschepler 它被标记为 C/C++。 @aschepler 确实,我不确定它是 C 还是 C++ 是否会对此有任何影响(如果确实如此,我会对那个轴承到底是什么感兴趣) @gandalf3 在 C 函数中按值返回可能不会返回只要调用者不使用返回值。在 C++ 中,调用者是否使用返回值并不重要,如果函数没有返回,则行为未定义。以上是关于为啥这个递归函数返回正确的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章