簡體   English   中英

我對變量在遞歸函數中的工作方式的理解正確嗎?

[英]Is my understanding of how variables work in recursive function correct?

最近,我在C ++類中進行了遞歸,我想知道變量的范圍對於特定的堆棧框架是本地的是否正確:

3)返回

2)flipString(“”); 開始= a,結束= t

1)flipString(at); 開始= s,結束= r

因此,當到達return語句時,它將彈出第三幀,

然后以s = t +“” + a關閉第二幀

然后第一幀s = r + at + s,從而反轉字符串。

void flipString(string &s)
{
   if (s.size() < 2)
   {
      return;
   }
   else
   {

      string begin;
      string end;      

      begin = s.at(0);
      end = s.at(s.size()-1);

      s.erase(s.begin());
      s.erase(s.end()-1);

      flipString(s); 

      s = end + s + begin;   
   }

   return;
}

是的,您對功能如何工作以及功能本身的想法似乎是正確的。

在每次調用函數時,都有一個不同的局部變量開始和結束實例,這些實例放在堆棧上。

函數參數s引用或指向所有堆棧幀中的相同字符串,因為它是一個引用。

如果傳遞一個普通的函數參數(沒有引用而不是指針),則在每個調用堆棧級別也將有該參數的單獨副本。

在這種情況下,需要了解三種符號類型:

  1. 局部變量-函數內聲明的符號
  2. 形式參數-在函數實現中用作參數的符號
  3. 實際參數-調用者在函數調用時傳遞的表達式

了解值的存儲位置以及堆棧的工作方式也很有用。

為每個函數調用創建一個堆棧框架。 這將創建函數執行的上下文以及對調用者上下文的引用。 當函數退出時,將刪除(彈出)函數的堆棧框架,並恢復調用者的上下文。

形式參數的位置保留在所調用函數的堆棧框架中。 同樣,局部變量存儲在函數的堆棧框架中。 實際參數或對它們的引用將復制到堆棧中,在此堆棧中它們的形式參數對應對象可以對其進行引用。

函數退出后,將釋放堆棧幀以及形式參數和局部變量空間。

請注意,對於作為參考值( & )傳遞給實際值的參數,這些值的空間可能存在於當前堆棧框架之外(只有引用地址本身位於堆棧框架之內。忘了這可能會使人混淆為什么值會在函數調用之間保持不變 。這在使用指針時更為明顯,但在傳遞引用時可能會被忽略。

暫無
暫無

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

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