SOGO論壇

標題: 區域變數 [列印本頁]

作者: mm117777    時間: 2012-7-21 10:18:55     標題: 區域變數

在一個 block,即於 大括號內 定義的變數都是 區域變數,於 該區域變數的名稱是 唯一的。因此,在 main 或 任意一函數內 定義的變數 都是區域性的,其生命期 -- 即有記憶體配置與該變數 -- 為程式執行該 block 的開始 至該 block 結束,程式的執行 一離開含變數定義的 block 則該變數就不存在。

例 1. 一程式的大綱含變數的宣告如下:

    1.    void f(int i)
    2.    { int j;.....}
    3.    void main()
    4.    {int a;
    5.    .....
    6.        {int i;.....
    7.        }
    8.       f(a);
    9.    }

說明:

程式的執行由 main 開始 因此,執行時 第 4 行的區域變數 a 已經存在,但第 6 行的變數 i 則尚未成形, 函數 f 的引數 i 與變數 j 亦不存在。
程式執行 第 6 行 區域變數 i 才存在。程式執行至第 8 行,該變數 i 就消失了。
程式執行 第 8 行 呼叫函數 f 時,引數 i 及變數 j 方產生。函數 f 執行結束後,引數 i 及變數 j 均消失不存在,除非再呼叫函數 f,這些 引數及變數 才重新出現。
一個區域變數其使用範圍僅限於含變數定義的 block。因此,在該 block 各地都可引用 該變數名稱。
由於 block 可含 block 形成階層式的架構,因此可能產生內外 block 都定義同名稱的變數,此時,內部 block 的區域變數可蓋過外部 block 的區域變數,即在內部 block 所引用的變數名稱都是引用內部 block 的變數而非外部的 block 的變數。 由例 2 來說明此現象。

例 2.

      1.  main()         
      2.  {   int i,j;
      3.      i=10; j=5;
      4.      {  int i;
      5.         i=j++;
      6.         printf("i=%d,j=%d\n",i,j);
      7.      }
      8.      printf("i=%d,j=%d\n",i,j);
      9.  }

說明:

main 含 2 個區域變數 i 及 j (以 i2, j2 表之,其中下標之 2 表示 變數定義於第 2 行),又於第 4 行至第 7 行的 block 含一區域變數 i4。
i2 的使用範圍為自第 2 行至第 9 行,扣除第 4 行至第 7 行,即自第 5 行 引用變數 i 是 i4而不是 i2。
j2 的使用範圍為自第 2 行至第 9 行。
i4 的使用範圍是自第 4 行至第 7 行。
程式執行完 第 5 行 i=j++; 後, i 的值為 5,即 i4 之值為 5,但 i2 的值仍為 10。
執行完該程式的結果為
i=5,j=6
i=10,j=6






歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM