C函数return的正确结果却没有给出return语句,为什么?

C function returns correct result but no return statement is given, why?

所以我写了一个函数,应该 return 第 n 个斐波那契数,但实际上我忘了 return 我的结果。我确实收到了“控件到达非空函数的末尾”警告,但代码执行正常并且 returned 得到了正确的结果。这是为什么? C怎么知道它应该 return "result"?

int fib (int n);

int main(int argc, char** argv) {
    printf("%d", fib(10));

}

int fib (int n){
   if (n == 1){
      return 1;
   }
   if (n == 0){
     return 0
   }
   fib(n-2) + fib(n-1)
}

它return编辑了这个

55

我尝试添加

 int j = n+1

到函数的最后一行,然后它实际上 returned 2,而不是 256。这是一个错误,还是 c 是如何读取这样的内容的?

在没有 return 语句的情况下到达非 void 函数的末尾会调用未定义的行为。获得预期结果是一种未定义行为,通常称为 运气 。顺便说一下,256 可能是你所期望的,但它不是 正确的

一个可能的解释是:由函数计算并存储到通常包含 return 值的寄存器中的最后一个值是预期结果。

当然你永远不应该依赖它,也不应该期待它。

这是使用编译器警告的一个很好的例子:不要忽略它们。始终打开更多编译器警告并修复代码。 gcc -Wall -Wclang -Weverything 可以发现许多愚蠢的错误并节省调试时间。

还有一些其他问题:

  • 你不包括<stdio.h>
  • 你计算了一个 unsigned long long 但只有 return 一个可能更小的类型 int
  • 您的算法计算 2 的幂,而不是斐波那契数。