Fibonacci程序出错

时间:2015-06-10 06:07:27

标签: c expression fibonacci

我试图用C语言找到C中的第k个斐波纳契数:

int fibk(int k)
{
    if(k == 1 || k== 2)
        return 1;

    int i,a = 1,b = 1;

    for(i=3;i<=k;i++)
    {
            b = a + (a=b);
    }

    return b;
}

我之前使用此代码交换两个变量值:

    a = a + b - (b = a)

所以我在尝试:

     b = a + (a=b);

但是,此代码首先将a的值更改为b,并将其简单地添加回自身,从而有效地将其值加倍,而不是将其添加到其先前的值。

为什么交换代码有效,但找不到下一个Fibonacci数的代码?

2 个答案:

答案 0 :(得分:2)

&#39; a&#39;可能是未定义的,所以&#34;交换代码&#34;实际上&#34;没有工作&#34;。一种方法是,您可以使用tem(临时)变量来保留b的值。试试这样:

tem = a + b;
a = b;
b = tem;

答案 1 :(得分:2)

要回答这个问题:a = a + b - (b = a);b = a + (a=b);都有未定义的行为。除非存在明确的序列点,否则C不指定评估顺序,也不指定副作用(例如变量赋值)发生的顺序。因此,在上述两个表达式中,右侧的赋值可以在访问赋值变量的值之前,之后或之后发生。 (“while”案例涵盖了在多个机器指令中完成赋值的情况,可能是因为变量太大而无法在单个指令中存储或加载。)

“未定义的行为”只是 - 未定义。它可能模仿你错误期望的行为;它可能只是以意想不到的顺序做事;它可能产生难以理解的垃圾;或者它可以被编译器简单地删除,以便根本不发生任何事情。或许多其他可能性。并且不能保证具有未定义行为的程序的行为与明天编译的同一程序的行为相同。

对于一个小小的奖金,因为你似乎试图避免使用临时变量,这里有一个不同的斐波纳契黑客,没有临时和没有UB:

int fibk(int n) {
  int a = 1, b = 0, i = n - 1;
  for (; i > 0; i -= 2) {
    b += a;
    a += b;
  }
  return i ? b : a;
}

由于它展开循环,它可能会稍快一些。然后,它可能不会。 :)