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

C語言全局變量與函數調用順序:static 變量生命週期經典面試題解析

     編輯:C 語言問答

代碼行為深度剖析


static int a = 5;  // 全局靜態變量,僅本文件可見,生命週期贯穿程序

void p1() {
    printf("a*a=%d\n", a*a);  // 使用全局 a (初始為5) → 25
    a = 2;                  // 修改全局 a 為 2
}

void p2() {
    printf("a*a*a=%d\n", a*a*a);  // 使用修改後的全局 a (2) → 8
}

int main() {
    printf("a=%d\n", a);  // 5
    p1();                 // 輸出 25,並將 a 改為 2
    p2();                 // 輸出 8
    return 0;
}

核心知識點

概念說明
全局變量定義於函數外部,默認外部鏈接,全程序可見(除非 static 限制)
static 全局變量僅當前源文件可見(內部鏈接),但生命週期仍為程序全周期
函數調用順序main → p1 → p2,p1 修改全局變量直接影響 p2 讀取值
無局部變量遮蔽p1、p2 內未定義局部 a,故直接操作全局 a

進階場景:若 p2 定義局部變量


void p2() {
    int a = 10;  // 定義局部變量 a,遮蔽全局 a
    printf("a*a*a=%d\n", a*a*a);  // 輸出 1000 (10^3)
}

此時 p2 使用局部 a=10,全局 a 不受影響,後續調用仍為 2。

最佳實踐

  • 盡量減少全局變量,傳遞參數或返回值替代
  • 必須使用全局狀態時,加 static 限制作用域
  • 多線程環境下全局變量需加鎖保護

理解變量作用域、生命週期與遮蔽規則,是寫出無副作用代碼的關鍵。

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