簡體   English   中英

將靜態結果賦給靜態變量的函數結果會在內部更改此靜態變量

[英]assignation to the static variable the result of function which changes this static variable inside

我想知道以下代碼中的標記行是否正確。 因為在這一行中,該函數的結果分配給靜態變量prevRecCallResult我將其稱為“ 普通分配 ),該變量在此函數內部進行了更改( 我將其稱為“ 內部分配 )。 是否可以確保執行“ 普通分配 ”時完成“ 內部分配 ”?

int f(int _n)
{
  if (_n >= 1)
  {
    static int prevRecCallResult;
    prevRecCallResult = f(_n - 1);  //<-- Is this line Ok?
    return prevRecCallResult + 1;
  }
  else
    return _n;
}

我知道,標准說,會出現一個序列點:

在函數返回時,將返回值復制到調用上下文中。

,但我不確定,這就是我的問題的答案。

更新:

考慮到我收到的答復,我應該澄清一下我的問題:

實質是:確實, f(_n - 1)完成之前 ,賦值表達式(在標記行中)未使用 prevRecCallResult (即,未被賦值表達式占用f(_n - 1)嗎? (因此,直到這一刻,對於f(_n - 1) 內部的任何賦值, prevRecCallResult都是完全免費的嗎?)

static int prevRecCallResult;
prevRecCallResult = f(_n - 1);  //<-- Is this line Ok?

您的代碼完全可以。 但是只是想讓您記住static int prevRecCallResult; 只執行一次。 但是prevRecCallResult = f(_n - 1); 在每個函數調用之后分配。 一旦函數返回prevRecCallResult的時間,函數的返回值將在其余函數中使用。

從函數返回后,靜態變量不會消失。 因此, prevRecCallResult將不會在函數調用之間死亡。

我記得所有靜態變量以及C和C ++中的所有全局變量都自動分配為其類型的默認值-在此示例中,“ static int prevRecCallResult”的默認值將為0。因此,您的擔心是沒有根據的(您可以輕松地使用調試器進行檢查)。 同時,我不明白為什么在此代碼中使用靜態變量...是只是簡化的代碼問題,還是試圖在遞歸函數的自動變量上節省內存的真實代碼?

暫無
暫無

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

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