int func(int n) {
static int m = 0; // 靜態局部變量
m = m + n;
return m;
}
int main() {
int i, a = 0;
for (i = 1; i <= 4; i++)
a += func(i);
printf("%d\n", a); // 輸出 20
return 0;
}
| 調用次數 | 參數 n | m 初始值 | m = m + n | 返回值 | 累加 a |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 1 | 1 |
| 2 | 2 | 1 | 3 | 3 | 4 |
| 3 | 3 | 3 | 6 | 6 | 10 |
| 4 | 4 | 6 | 10 | 10 | 20 |
最終 a = 1+3+6+10 = 20
int func(int n) {
int m = 0; // 自動局部變量,每次調用重新創建、初始化、銷毀
m = m + n;
return m;
}
| 調用次數 | 參數 n | m 值 | 返回值 | 累加 a |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 1 |
| 2 | 2 | 2 | 2 | 3 |
| 3 | 3 | 3 | 3 | 6 |
| 4 | 4 | 4 | 4 | 10 |
最終 a = 1+2+3+4 = 10
| 特性 | static 局部變量 | 自動局部變量 |
|---|---|---|
| 存儲區 | 靜態存儲區 (.data/.bss) | 棧 |
| 初始化 | 僅首次調用前初始化一次 | 每次調用時初始化 |
| 生命週期 | 程序整個運行期間 | 函數調用期間 |
| 值的保持 | 調用間保持值 | 調用間不保持 |
掌握 static 在不同位置(全局、函數內、類成員)的語義差異,是 C/C++ 進階的必修課。