1

当我执行这个 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;
}
4

7 回答 7

7

你需要做foo(--n)而不是foo(n--)

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

所以当你这样做时,你会减少 n 的值,但是在递减之前将 nfoo(n--)发送到函数。foo正如你可以猜到的那样,这将永远存在

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阅读这里的区别

于 2013-08-14T07:44:47.483 回答
3

因为fun(n--);意味着funvalue调用n然后decrement 。n

于 2013-08-14T07:44:58.753 回答
3

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

int temp = n;
n = n - 1;
func(temp);
于 2013-08-14T07:45:24.230 回答
3

请注意,foo( n-- )它将返回n然后减n一(请参阅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

于 2013-08-14T07:45:44.657 回答
2

尝试 :

void fun(int n)
{
    if(!n)
    {
        cout << n << " " << endl;
    }
    else
    {
        cout << n << " "<<endl;
        fun(--n);
    }
}
于 2013-08-14T07:47:12.913 回答
2

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

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

于 2013-08-14T07:45:32.780 回答
1

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

于 2013-08-14T07:45:55.430 回答