如果没有return语句,这个C int函数如何工作?

我有这个C代码,我确信它不会起作用,但确实如此。

#include  int* find (int* a, int val) { if (*a == val) return a; else find(a+1, val); } int main() { int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *b; b = find(a, 7); printf("%d\n", *b); return 0; } 

当然,我从gcc收到警告,因为它在find函数的else分支中缺少一个return语句。 但是,它完美地运作。

为什么会这样? 如何通过递归函数返回int? 当然,最后一次调用返回一个int,但我在void上下文中调用它。

假设你打算写find而不是trova (我知道学习意大利语有一天会派上用场:),答案是这不能完美。 由于未定义的行为,它纯粹是偶然地“起作用”。

最有可能的是,最深的递归调用将返回值推送到某个寄存器,高级调用不会触及,因为它们没有返回语句,并且当调用者检查该寄存器时,最深调用的返回值还在那里。 但是,你不能依赖于此。

此代码不是有效的C代码,并且未定义此类代码的行为。

它工作的一个原因可能是在find的最后一次调用之后没有操作,这可能导致递归调用的返回值停留在返回寄存器(可能是eax)中。

但同样 – 行为未定义

似乎有效,但它是未定义的行为 。 只是在您的特定实现/平台b采用从find返回的最新值。 但是,在不同的实现/平台上,这可能也会崩溃。

我找不到引用,但我记得多年前,在GCC中,返回值寄存器(在CPU上分配)总是有最后一个返回值,所以如果你计算了一些值并返回没有值,那么价值持续存在。 使用这个“function”似乎是一种不好的做法。

也许还能看到

http://stackoverflow.com/questions/1610030/why-can-you-return-from-a-non-void-function-without-returning-a-value-without-pr

C:如果没有给出值,则默认返回值?

这就是说:Uniballer 2012年6月15日,01:44 C语言没有定义这种行为,因为你没有在函数声明中用你所说的去做。 实际上,在x86上,函数的值将是返回时在寄存器eax中发生的任何事情。