首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ static 靜態變數遞迴輸出 0000 原理圖解

     編輯:程式設計綜合問答

代碼與輸出

int main(void) {
    static int i = 5;
    if (--i) {
        main();      // 遞迴呼叫
        cout << i << endl; // 返回點執行輸出
    }
    return 0;
}
// 輸出:0 0 0 0 (四個 0,每行一個)

關鍵點:static 生命週期 + 遞迴棧幀

  • static int i:全程**只有一份**記憶體,存放在靜態區。所有遞迴層級**共享同一個 i**。
  • --i:先遞減再判斷。序列:5→4→3→2→1→0。
  • if(0) 為假,遞迴終止。

逐幀執行流程圖解

遞迴層級 (呼叫深度)進入 if 前 i 值--i 後 i 值if 判斷動作返回時輸出 i
第 1 層 (main 初始)54真呼叫 main()等待子層返回...
第 2 層43真呼叫 main()
第 3 層32真呼叫 main()
第 4 層21真呼叫 main()
第 5 層10假不進 if,直接 return無輸出 (if 內無語句)
--- 遞迴展開,開始返回 ---
返回第 4 層繼續執行 cout << i << endl;0 (共享變數現為 0)
返回第 3 層繼續執行 cout << i << endl;0
返回第 2 層繼續執行 cout << i << endl;0
返回第 1 層繼續執行 cout << i << endl;0

為什麼輸出四個 0?

  1. 遞迴深度為 4 (i 從 4 遞減到 1 時進入遞迴,共 4 次成功呼叫)。
  2. 第 5 次呼叫時 i 變 0,不進入 if,**不輸出**,直接返回。
  3. 前 4 層在 main() 返回**後**執行 cout << i。
  4. 此時靜態變數 i 已被第 5 層遞減為 0,且全域唯一。
  5. 因此 4 層依次輸出同一個記憶體位置的值:**0 0 0 0**。

對比:若去掉 static

int main(void) {
    int i = 5; // 非靜態,每層棧幀獨擁一份 i
    if (--i) {
        main();
        cout << i << endl;
    }
}
// 輸出:1 2 3 4 (各層獨立 i,返回時各層 i 為 1,2,3,4)

總結

static 讓變數「穿越」棧幀共享同一塊記憶體。 遞迴「去」的過程修改了這塊共享記憶體 (i 歸零);遞迴「回」的過程讀取這塊已歸零的記憶體。理解「去時修改、回時讀取、共享同一份」即掌握本題精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved