我对变量在递归函数中如何工作的理解是否正确?
Is my understanding of how variables work in recursive function correct?
我最近在我的C++类中得到了递归,我想知道认为变量的作用域是特定堆栈帧的局部是否正确:
3) 退货
2) 翻转字符串(" ");开始 = a,结束 = t
1) 翻转字符串(在);开始 = s,结束 = r
因此,当它到达返回语句时,它将弹出 第三帧关闭,
然后第二帧关闭,s = t + " " + a
然后是 s = r + at + s 的第一帧,从而反转字符串。
void flipString(string &s)
{
if (s.size() < 2)
{
return;
}
else
{
string begin;
string end;
begin = s.at(0);
end = s.at(s.size()-1);
s.erase(s.begin());
s.erase(s.end()-1);
flipString(s);
s = end + s + begin;
}
return;
}
是的,你对函数如何工作和函数本身的想法似乎是正确的。
在每次调用函数时,局部变量的开始和结束都有一个不同的实例,放置在堆栈上。
函数参数引用或指向所有堆栈帧中的同一字符串,因为,嗯,它是一个引用。
如果传递了一个纯函数参数(没有引用,也不是作为指针),则在每个调用堆栈级别也会有一个单独的参数副本。
在此上下文中,需要了解三种符号类型:
- 局部变量 — 在函数中声明的符号
- 形式参数 — 在函数实现中用作参数的符号
- 实际参数 — 调用方在函数调用时传递的表达式
了解值的存储位置以及堆栈的工作原理也很有用。
为每个函数调用创建一个堆栈帧。这将为函数的执行创建上下文和对调用方上下文的引用。当函数退出时,函数的堆栈帧将被删除(弹出),并恢复调用方的上下文。
形式参数的位置保留在被调用函数的堆栈帧中。类似地,局部变量存储在函数的堆栈帧中。实际参数或对它们的引用被复制到堆栈中,在那里它们的形式参数对应项可以引用。
当函数退出时,堆栈帧与形式参数和局部变量空间一起被释放。
请注意,对于作为实际值的引用(&
)传递的参数,值的空间可能存在于当前堆栈帧之外(只有引用地址本身在堆栈帧内)。忘记这一点可能会导致混淆为什么值在函数调用中持久存在。这在指针中更为明显,但在传递引用时可能会被忽略。
相关文章:
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- 隐式转换是否应该在模板参数的上下文中工作?
- C++:检查动态取消分配是否正常工作
- 将正常函数的工作分配给多个线程是否安全
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- SetTimer (带有回调函数)是否通过启动新线程来工作?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- std::move 是否始终按预期工作
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 我对变量在递归函数中如何工作的理解是否正确?
- 下课时的数组是否可以正常工作?
- 是否有任何简单的方法来查找当前的工作目录?C
- 线程安全定时来对齐在多个线程中收集的数据-QElapsedTimer是否工作
- 函数用于检查二叉树是否为二叉搜索树或是否工作