为静态变量赋值函数的结果,它改变了这个静态变量

时间:2015-01-16 14:01:41

标签: c++ recursion static variable-assignment

我想知道,下面代码中的标记行是否正确。因为在这一行中,函数的结果被赋值给静态变量prevRecCallResult我称之为“普通赋值),这在内部被更改这个功能(我称之为“内部分配)。 是否有保证,当“普通作业”执行时,“内部作业”已完成?

int f(int _n)
{
  if (_n >= 1)
  {
    static int prevRecCallResult;
    prevRecCallResult = f(_n - 1);  //<-- Is this line Ok?
    return prevRecCallResult + 1;
  }
  else
    return _n;
}

我知道,标准说,出现了一个序列点:

  

在函数返回时,将返回值复制到   调用上下文。

,但我不确定,这是我的问题的答案。

更新

考虑到我收到的回复,我应该澄清我的问题:

它的本质是:它是真的,prevRecCallResult不是在使用中由赋值表达式(在标记行中)(即没有被它占据)直到 f(_n - 1)已完成? (因此,到目前为止,prevRecCallResult f(_n - 1)内的任何作业完全免费?)

2 个答案:

答案 0 :(得分:1)

static int prevRecCallResult;
prevRecCallResult = f(_n - 1);  //<-- Is this line Ok?

你的代码完全没问题。但只是想让你记住static int prevRecCallResult;只执行一次。但是在每次函数调用后都会分配prevRecCallResult = f(_n - 1);。一旦函数返回prevRecCallResult时,函数的返回值将用于函数的其余部分。

还有一件事,从函数返回后,静态变量不会死亡。所以prevRecCallResult不会在函数调用中消失。

答案 1 :(得分:0)

我记得所有静态变量以及C和C ++中的所有全局变量都自动分配给它们的类型的默认值 - 在这个特定的例子中,&#39; static int prevRecCallResult&#39;将是0.所以你的恐惧是没有根据的(你可以用调试器轻松检查)。 同时我无法理解为什么你在这段代码中使用静态变量...它只是简化的问题代码还是真正的代码,你试图在递归函数的自动变量上节省内存?