将更改此静态变量内部的函数的结果分配给静态变量

assignation to the static variable the result of function which changes this static variable inside

本文关键字:静态 变量 结果 分配 函数 内部      更新时间:2023-10-16

我想知道,下面代码中的标记行是否正确。因为在这一行中,函数的结果被分配给静态变量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;
}

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

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

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

更新:

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

它的本质是:在f(_n - 1)完成之前,赋值表达式(在标记行中)(即不被它占用)prevRecCallResult是否属实?(因此,直到这一刻,prevRecCallResult完全免费进行f(_n - 1)内部的任何作业?

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

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

还有一件事,静态变量不会死,在你从函数返回后。因此,prevRecCallResult不会在函数调用中死亡。

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