我想知道,下面代码中的标记行是否正确。因为在这一行中,函数的结果被赋值给静态变量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)
内的任何作业完全免费?)
答案 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.所以你的恐惧是没有根据的(你可以用调试器轻松检查)。 同时我无法理解为什么你在这段代码中使用静态变量...它只是简化的问题代码还是真正的代码,你试图在递归函数的自动变量上节省内存?