为什么以下程序会进行无限循环?

时间:2013-08-14 07:43:03

标签: c++ recursion decrement

当我执行这个belo程序时,它正在打印5。为什么? 是因为减量没有发生还是在减量发生之前函数调用正在发生?

我尝试了制作fun(--n)的替代方式,它给了我正确答案。但为什么它不适用于fun(n--)

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(n--);
    }
}

int main()
{
    int n = 5;
    fun(n);
system("pause");
return 0;
}

7 个答案:

答案 0 :(得分:7)

您需要foo(--n)而不是foo(n--)

  • - n将递减n的值,然后发送递减的值
  • n--将递减n的值,但发送预先递减的值 值。

所以当你执行foo(n--)时,你会减去n的值,但是发送到foo函数n nofore递减。正如你猜测那将永远存在

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(--n);
    }
}

int main()
{
    int n = 5;
    fun(n);
system("pause");
return 0;
}

详细了解n----n阅读here

之间的区别

答案 1 :(得分:3)

因为fun(n--);表示使用值fun调用n,然后减少n

答案 2 :(得分:3)

因为n--在递减其值之前返回n 。由于您以这种方式调用函数,n始终具有相同的值。 您可以这样写func(n--)

int temp = n;
n = n - 1;
func(temp);

答案 3 :(得分:3)

请注意,foo( n-- )将返回n,然后将n减1(请参阅this),因此返回5,5,5,...重复。您需要执行以下一个

foo( --n ); // or,
foo( n - 1 );

...因此您的代码应如下所示:

void fun( int n ) {
  if( !n ) {
    cout << n << " " << endl;
  } else {
    cout << n << " "<< endl;

    n--;
    fun( n );
  }
}

int main( void ) {
  int n = 5;

  fun( n );
  system("pause");

  return 0;
}

旁白:最好不要在另一个表达式中包含任何递增或递减操作。如果你做了以下事情就没问题了:

n--;
foo( n );

...如果你在表达式中开始递增和递减,它可能导致作为客户端(甚至作为程序员)的混淆。考虑这是另一个例子,这样做是的想法:

if ( ( condition_1 == true ) && ( i++ == val ) )

...如果第一个条件是false,它将永远不会达到第二个条件,因此不会增加i

答案 4 :(得分:2)

使用fun(--n)代替fun(n--)

这种情况发生的原因是因为n--在函数运行之后递减,而--n在之前递减时反复返回5。

答案 5 :(得分:2)

尝试:

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(--n);
    }
}

答案 6 :(得分:1)

您提供与之前调用中提供的fun()相同的值。