變數的作用範圍及生命週期
區塊式結構 (block structure) 的程式語言
C 語言是區塊式結構的程式語言, 所謂的區塊是
一對大括號
所界定的範圍, 每一對大括及其涵括的所有敘述構成 C 語法中所謂的複合敘述 (compound statement), 這樣子的複合敘述不但對於編譯器而言構成一個
有意義的文法單位
, 對於程式設計者而言一個區塊也應該要代表一個
完整的邏輯單元
, 內含的敘述應該具有相當的資料耦合性 (一個敘述處理過的資料會被後面的敘述拿來使用), 及控制耦合性 (CPU 處理完一個敘述後會接續處理另一個敘述指定的動作), 當看到程式中一個區塊時, 應該要可以
假設其內所包含的敘述都是屬於某些相關功能的
, 當然其內部所使用的資料應該都是完成該種功能所必需的, 這些資料應該是
專屬於這個區塊內的敘述, 是這個區塊之外的敘述不需要的
。
命名空間 (naming space)
C 語言中區塊定義了一塊所謂的
命名空間 (naming space)
, 在每一個命名空間內程式設計者可以對其內定義的變數任意取名字, 稱為
區域變數 (local variable)
, 這些變數只有在該命名空間 (區塊) 內部可以進行存取, 到了該區塊之外程式就不能在藉由該名稱來存取了, 如下例中 int 型態的變數 z。 由於區塊是階層式的, 大區塊可以內含小區塊, 大區塊內的變數也可以在內含區塊內使用, 例如:
{ int x, r; . . . x=10; r=20; { int y, z; float r; y = x; x = 1; r = 10.5; } z = x; // 錯誤,不可使用變數 z }
上面這個例子裡有兩個區塊, 也就有兩個命名空間, 有任一個命名空間中不可有兩個變數使用相同的名字, 不同的命名空間則可以取相同的名字, 例如變數 r, 因此針對某一個變數來說, 可以使用到這個變數的程式範圍就稱為這個
變數的作用範圍 (scope)
。
變數的生命期 (Lifetime)
變數的生命始於定義之敘述而一直延續到定義該變數之區塊結束為止, 變數的作用範圍意指程式在何處可以存取該變數, 有時變數是存在的,但是程式卻無法藉由其名稱來存取它, 例如, 上例中內層區塊內無法存取外層區塊所定義的變數 r, 因為在內層區塊中 r 這個名稱賦予另一個 float 型態的變數了。
縮小變數的作用範圍
利用 C 語言的區塊命名空間的設計, 程式設計者可以儘量把變數的作用範圍縮小, 如下例:
{ int tmp; for (tmp=0; tmp<1000; tmp++) doSomeThing(); } . . . { float tmp; tmp = y; y = x; x = y; }
上面這個範例中前後兩個區塊中的 tmp 很明顯地沒有任何關係, 看這個程式的人不必擔心程式中有藉 tmp 變數傳遞訊息的任何意圖,
程式中任何一個敘述可以更改及使用任何作用中的變數內的資料
,
因此如果作用中的變數愈多, 程式的邏輯可能性就愈多、 程式也就愈複雜
, 這是設計程式的人應該儘量避免的。 請參考
變數的最小範疇原則
。
回
程式設計課程
首頁
by Pei-yih Ting
E-mail:
pyting@cs.ntou.edu.tw