例如。假设我有一个名为recursionFunction
的函数。在此函数中,我将变量userInput
设置为等于用户输入的值,然后调用函数本身。在递归中输入的用户输入是否会更改原始变量?
我的查询来自我对范围和地址的小理解。 如果函数不同,则不应将变量识别为同一变量。但它是'同一功能',不是吗?它应该在RAM中具有相同的地址,因此会被覆盖?或者它是否具有相同的地址,尽管具有相同的变量名称的相同功能?
忽略这样一个函数会导致无限循环的事实。让我们假装我有办法停止这个程序。这不是一个意见问题,它显然只会像我描述的那样发生。提前谢谢。
我主要从事Java工作,我正在努力学习C ++,这就是为什么要包含这些标签的原因。
编辑:模拟代码(同样,我知道会发生无限循环,让我们假装它没有)递归会改变原始调用中的userInput变量吗?
int recursionFunction()
{
int userInput;
std::cin >> userInput;
recursionFunction();
return 0;
}
答案 0 :(得分:4)
您实际上是在询问递归调用期间局部变量会发生什么。答案很简单 - 每个函数调用都有自己的堆栈框架,即这些局部变量完全相互隔离。该图有助于:(source)
执行此代码后显示堆栈:
function f(int x, int y) {
int a;
if ( term_cond ) return ...;
a = .....;
return g(a);
}
function g(int z) {
int p,q;
p = ...; q = ...;
return f(p,q);
}
答案 1 :(得分:1)
是的,如果您将变量userInput
声明为static
,则可以。这意味着变量不会在堆栈上,而是在堆上有一个固定的位置。所以它就像一个全局变量,但它只能从函数内部访问。
答案 2 :(得分:0)
不,除非使用pass by reference作为调用方法。
每个功能都有自己的范围。只有当您发送并操作指向内存的指针时,它才会相同。
在这个例子中,它们永远不会干扰(虽然这是一个永远不会退出的无限循环,最终会产生堆栈溢出......)
void RecursionFunction(void)
{
unsigned int uiVal;
uiVal = input();
RecursionFunction();
}
这里始终是每次递归中更改的内存区域
void RecursionFunction(unsigned int* uiVal)
{
*uiVal = input();
RecursionFunction(uiVal);
}
void main()
{
unsigned int uiVal;
RecursionFunction(&uiVal)
}
和引用(也会改变相同的内存区域):
void RecursionFunction(unsigned int &uiVal)
{
uiVal = input();
RecursionFunction(uiVal);
}
void main()
{
unsigned int uiVal;
RecursionFunction(uiVal)
}