在递归函数的函数调用中修改通过引用传递的参数
Modifying Arguments passed by reference in the function call in a recursive function
这是一个简单的代码,它将计数器作为引用传递参数,然后打印它:
#include <iostream>
using namespace std;
void Fun(int &counter, int n)
{
if(n==0)
return;
Fun(counter+1,n--);
}
int main() {
int counter = 0;
int n = 5;
Fun(counter,n);
cout<<counter<<endl;
return 0;
}
我遇到了这个错误。
prog.cpp: In function ‘void Fun(int&, int)’:
prog.cpp:7:16: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
Fun(counter+1,n);
^
prog.cpp:3:6: note: initializing argument 1 of ‘void Fun(int&, int)’
void Fun(int &counter, int n)
^
有人可以帮忙吗,为什么会出现这个错误?
在 Fun(counter+1,n--);
中,您没有将 counter
传递给函数。您从传递给函数的 counter+1
创建一个临时文件。要延长通过引用获取的临时文件的寿命,它需要 const
,因此 void Fun(const int &counter, int n)
将是可编译的。
然而,当函数结束时,计数器将是 0
,因为你永远不会改变 counter
,并且函数永远不会 return,因为你不会减少你传递的 n
到功能。您使用 n
和 调用函数,然后 减少 n
.
备选方案:
void Fun(int &counter, int n)
{
if(n==0)
return;
Fun(counter += 1, n - 1); // or Fun(++counter, --n);
}
counter += 1
和 ++counter
return 都是对 counter
的引用,这就是它起作用的原因。
然而,counter++
和 n--
不会 工作,因为 post-increment 运算符 return 也是临时的,例如:
int old = n;
n = n - 1;
return old;
这是一个简单的代码,它将计数器作为引用传递参数,然后打印它:
#include <iostream>
using namespace std;
void Fun(int &counter, int n)
{
if(n==0)
return;
Fun(counter+1,n--);
}
int main() {
int counter = 0;
int n = 5;
Fun(counter,n);
cout<<counter<<endl;
return 0;
}
我遇到了这个错误。
prog.cpp: In function ‘void Fun(int&, int)’:
prog.cpp:7:16: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
Fun(counter+1,n);
^
prog.cpp:3:6: note: initializing argument 1 of ‘void Fun(int&, int)’
void Fun(int &counter, int n)
^
有人可以帮忙吗,为什么会出现这个错误?
在 Fun(counter+1,n--);
中,您没有将 counter
传递给函数。您从传递给函数的 counter+1
创建一个临时文件。要延长通过引用获取的临时文件的寿命,它需要 const
,因此 void Fun(const int &counter, int n)
将是可编译的。
然而,当函数结束时,计数器将是 0
,因为你永远不会改变 counter
,并且函数永远不会 return,因为你不会减少你传递的 n
到功能。您使用 n
和 调用函数,然后 减少 n
.
备选方案:
void Fun(int &counter, int n)
{
if(n==0)
return;
Fun(counter += 1, n - 1); // or Fun(++counter, --n);
}
counter += 1
和 ++counter
return 都是对 counter
的引用,这就是它起作用的原因。
counter++
和 n--
不会 工作,因为 post-increment 运算符 return 也是临时的,例如:
int old = n;
n = n - 1;
return old;