int main(void) {
static int i = 5;
if (--i) {
main(); // 遞迴呼叫
cout << i << endl; // 返回點執行輸出
}
return 0;
}
// 輸出:0 0 0 0 (四個 0,每行一個)
| 遞迴層級 (呼叫深度) | 進入 if 前 i 值 | --i 後 i 值 | if 判斷 | 動作 | 返回時輸出 i |
|---|---|---|---|---|---|
| 第 1 層 (main 初始) | 5 | 4 | 真 | 呼叫 main() | 等待子層返回... |
| 第 2 層 | 4 | 3 | 真 | 呼叫 main() | |
| 第 3 層 | 3 | 2 | 真 | 呼叫 main() | |
| 第 4 層 | 2 | 1 | 真 | 呼叫 main() | |
| 第 5 層 | 1 | 0 | 假 | 不進 if,直接 return | 無輸出 (if 內無語句) |
| --- 遞迴展開,開始返回 --- | |||||
| 返回第 4 層 | 繼續執行 cout << i << endl; | 0 (共享變數現為 0) | |||
| 返回第 3 層 | 繼續執行 cout << i << endl; | 0 | |||
| 返回第 2 層 | 繼續執行 cout << i << endl; | 0 | |||
| 返回第 1 層 | 繼續執行 cout << i << endl; | 0 | |||
main() 返回**後**執行 cout << i。i 已被第 5 層遞減為 0,且全域唯一。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 歸零);遞迴「回」的過程讀取這塊已歸零的記憶體。理解「去時修改、回時讀取、共享同一份」即掌握本題精髓。