通过引用传递

时间:2013-03-03 22:58:17

标签: c++

这段代码有什么问题?这是我正在做的简化版本。它是一个递归函数调用同一个变量。

#include <iostream>

using namespace std;
void Foo(int& x)
{
    x++;
    Foo(x);
    cout<<x<<"\n";
    if(x==10)
        return;
}

int main()
{
    int x=0;
    Foo(x);
    return 0;
}

3 个答案:

答案 0 :(得分:3)

此函数没有终止条件,它只是无条件地调用自己,尝试设置无限递归:

void Foo(int& x)
{
    x++;
    Foo(x); // <==== UNCONDITIONALLY RECURSIVE
    cout<<x<<"\n";
    if(x==10)
        return;
}

由于每个函数调用的堆栈帧占用一些内存空间,因此无法进行无限递归:迟早,您的堆栈将超出其限制大小,并且您的程序将被强制终止。

答案 1 :(得分:3)

x++;
Foo(x);
cout<<x<<"\n";
if(x==10)
    return;

问题是这会导致无限递归。您只能在函数调用之后检查if (x == 10) ,因此无法进入返回条件。通过编写

来解决这个问题
x++;
if(x==10)
    return;

Foo(x);
cout<<x<<"\n";

答案 2 :(得分:1)

你有一个无限的递归。它将继续创建堆栈帧,直到堆栈空间耗尽。在递归调用之前,您需要一个退出警戒:

void Foo(int& x)
{
    cout<<x<<"\n";
    if(x==10)
        return;
    x++;
    Foo(x);
}