2016-08-20 47 views
0

所以,我已经写了应该返回第n个Fibonnacci数的函数,但我忘了居然回我的结果。我确实得到了“控制到达非空函数的结束”警告,但代码执行得很好并返回了正确的结果。这是为什么? C如何知道它应该返回“结果”?C函数返回正确的结果,但没有给出返回语句,为什么?

int fib (int n); 

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

} 

int fib (int n){ 
    unsigned long long result = 1; 
    unsigned long long aux = 0; 

    while (n > 1){ 
     result += aux; 
     aux = result; 
     n--; 
    } 
} 

它返回此

256 

我试图

int j = n+1 

添加到函数的最后一行,然后将它实际返回2,而不是256.这是一个bug,或者c如何读取这样的内容?

+4

未定义行为是不确定的行为。其中一种可能性是它似乎可以工作。 –

+0

顺便说一句,它*不*工作。如果'fib'函数应该返回第n个斐波那契数,那么得到的结果实际上是错误的,它应该是'55'。 –

+0

哎呀,你是对的!但是,这是我的算法是错误的,我的意思是“作品”是它编译并返回结果变量的最终值。 – yeahboy

回答

4

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

一个可能的解释是:通过函数计算和存储通常会包含返回值寄存器的最后一个值是预期的结果。

当然,你应该永远依靠这一点,也没有想到它。

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

这里有一些其他问题:

  • 你不包括<stdio.h>
  • 你计算的unsigned long long,但只返回一个可能较小型int
  • 你的算法计算2的幂,不是斐波那契数。
相关问题