在递归函数的函数调用中修改通过引用传递的参数

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;