【发布时间】: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) 完了? (因此,直到现在,prevRecCallResult 对 inside f(_n - 1)? 的任何分配都是完全免费的?)
【问题讨论】:
-
使用静态变量会使函数线程不安全(对于其他类型的一般情况,可能效率有点低,因为编译器将不得不努力make the initialization of that variable thread safe)。
标签: c++ recursion static variable-assignment