簡體   English   中英

遞歸函數參數中前后遞減之間的差異

[英]Difference between pre and post decrement in recursive function argument

我有以下示例代碼,其中使用了預減量

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 無限循環

你能詳細解釋一下為什么會發生這種情況嗎?

因為--c會返回c-1 ,但是c--返回c 。所以當你使用function(c--)等於function(c);c = c-1; . c永遠不會是0 。所以函數不會停止。 要了解--xx--之間的區別,您可以嘗試以下代碼:

int x = 5,y=5;
cout<<x--<<endl;
cout<<--y<<endl;
cout<<x<<" "<<y<<endl;

發生這種情況是因為 function(c--) 將使用相同的 c 值調用,並且當它完成時 c 將遞減。 但是由於它是遞歸調用的,因此它將以相同的值調用而沒有返回的機會,最終您將遇到堆棧溢出錯誤。

假設這樣,int x = 1, y = 0; 現在 y = x++ 將導致 y == 1 和 x == 2。但是如果你執行 y = ++x ,那么 bot x 和 y 將是 2。

如果后遞減值將在遞減之前傳遞,則始終將相同的值傳遞給函數,它永遠不會出來。

function(c--),首先調用 function(c),然后遞減 c-- 會發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM