【问题标题】:assignation to the static variable the result of function which changes this static variable inside分配给静态变量的函数的结果,它改变了这个静态变量内部
【发布时间】:2015-01-16 14:01:41
【问题描述】:

我想知道,下面代码中的标记行是否正确。因为在这一行中,函数的结果被赋值给了静态变量prevRecCallResult我称之为“plain assignment),它在这个函数内部被改变了(我称之为“inside assignment)。 当“plain assignment”执行时,是否保证“inside assignment”完成?

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不是在使用中被赋值表达式(在标记行中)(即未被它占用)直到 em> f(_n - 1) 完了? (因此,直到现在,prevRecCallResultinside f(_n - 1)? 的任何分配都是完全免费的?)

【问题讨论】:

标签: c++ recursion static variable-assignment


【解决方案1】:
static int prevRecCallResult;
prevRecCallResult = f(_n - 1);  //<-- Is this line Ok?

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

还有一点,静态变量在你从函数返回后不会死掉。所以prevRecCallResult 不会在函数调用中死掉。

【讨论】:

  • 但是你能告诉我,我的这行代码是正确的吗?
  • @user3241228 为什么它是错误的。您正在递归调用prevRecCallResult,每次您将参数的值减1并在prevRecCallResult中返回时,现在您可以使用它了。这有什么问题?
  • @user3241228 我已经更新了我的答案 --> 还有一件事,静态变量不会死,从函数返回后。所以 prevRecCallResult 不会跨函数调用而死。
【解决方案2】:

我记得 C 和 C++ 中的所有静态变量以及所有全局变量都会自动为其类型分配默认值 - 在这个特定示例中,“static int prevRecCallResult”的默认值将为 0。所以你的担心是没有根据的(您可以使用调试器轻松检查)。 同时我不明白你为什么在这段代码中使用静态变量......它只是简化的问题代码还是你试图在递归函数的自动变量上节省内存的真实代码?

【讨论】:

  • 这是一个稍微简化的例子。是的,我在这里使用static 来防止创建与递归深度一样多的此变量的副本。
  • 我明白了。所以,你可以使用静态变量的特性 - link
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多