递归函数参数中前后递减的区别

时间:2015-05-15 05:19:55

标签: c++ recursion post-increment pre-increment

我有以下示例代码,其中我使用了预先减少

void function(int c)
{
  if(c == 0)
  {
     return;
  }
  else
  {
    cout << "DP" << c << endl;
    function(--c);
    cout << c << endl;
    return;
  }
}

此函数为输入4提供输出:

 DP3
 DP2
 DP1
 DP0
 0
 1
 2
 3

但是当我使用后减法时

void function(int c)
{
  if(c == 0)
  {
    return;
  }
  else
  {
    cout << "DP" << c << endl;
    function(c--);
    cout << c << endl;
    return;
  }
}

输出与DP4无限循环

你能详细解释一下为什么会这样吗?

3 个答案:

答案 0 :(得分:5)

由于--c将返回c-1,但c--会返回c。因此,当您使用function(c--)时,等于function(c);c = c-1;。{{ 1}}永远不会是c。所以函数不会停止。 要了解0--x之间的区别,您可以尝试以下代码:

x--

答案 1 :(得分:5)

这是因为函数(c--)将使用相同的c值调用,并且当它完成时c将递减。但由于它是递归调用的,因此它将被调用相同的值而没有返回的机会,最终你会遇到堆栈溢出错误。

假设这个,int x = 1,y = 0;现在y = x ++将导致y == 1和x == 2.但是如果你做y = ++ x,那么bot x和y将是2。

答案 2 :(得分:1)

如果后递减值将在递减之前传递,则总是将相同的值传递给函数,它永远不会出现。

函数(c--),首先它调用函数(c)后来递减c--将会发生。