1.1 變數作用域
1.1.1 幾種常見型別變數的作用域
作用域(scope)或者可見性是指變數在程式內的可見和可引用的範圍。
比如:1、 全域性變數在所有的檔案都可見,那他的作用域就是所有檔案;
2、 static定義的全域性變數,只在定義它的原始檔中可見,那他的作用域就是其所在的原始檔;
3、 函式內部的區域性變數,只在其函式範圍內可見;
4、 有些變數,只在某一塊**段內可見(花括號括起來的一段**);
void test_fun()
int test_i = 0;
test_i = 10;
if (test_i != 0)
int test_count = 15;
test_i = test_count;
test_i = test_count;//這裡會編譯出錯,因為test_count只在if條件的花括號中有效。
1.1.2 變數使用的高階話題
下面大部分內容來自《**大全》。
1.1.2.1 使變數引用區域性化
《**大全》這本書介紹了攻擊視窗的概念:介於同乙個變數多個引用點之間的**可成為攻擊視窗,在這個視窗中新增**,可能會不當的修改此變數。
一般而言,把對乙個變數的引用區域性化,即把引用點盡可能集中在一起總是一種很好的做法。主要的好處是提高程式的可讀性和可維護性。如果變數的引用點都很集中,則閱讀**的時候,只要關注這一塊**就可以了,否則,閱讀者的目光需要在**中跳來跳去。
如何衡量變數引用的集中程度?《**大全》提到了變數跨度的概念:對變數所有引用間相隔的**行數。
void test_fun()
int test_i = 0;
int test_j = 0;
test_i = 10;//和第一次引用間隔1行**
if (test_i != 0)//和第二次引用間隔0行**
int test_count = 15;
test_i = test_count;//和第三次引用間隔1行**
test_i的跨度總共是2。test_i的平均跨度是2/3。
1.1.2.2 縮短變數的存活時間
變數的存活時間—— 乙個變數存在期間所跨越的語句總數。也就是從第一次引用,到最後一次引用之間跨越**的行數。
跨度表明變數引用的集中程度,存活時間表明變數經歷的語句。
如上圖所示,test_i存活時間是6條語句。
低存活時間的好處:
1、減小攻擊視窗,不易出錯。
2、使你對**有更準確的認識(提高可讀性)
3、減少初始化錯誤。
最後,乙個明顯的好處是便於程式重構,如果乙個程式拆分為多個小的程式,短的存活時間更有價值。
用跨度和生存時間來考察全域性變數,會發現全域性變數跨度和生存時間都很長——這是避免使用全域性變數的好的理由之一。
1.1.2.3 減小作用域的一般原則
1、在迴圈開始之前再去初始化改迴圈裡使用的迴圈變數,而不是在該迴圈所屬的子程式的開始處初始化這些變數。
2、直到變數即將被使用時再為其賦值。把宣告和定義放在使用之前。
3、把相關語句放在一起。減少變數的跨度和生存時間。
4、把相關的語句組提取成功單獨的子程式。把乙個長的子程式拆分為更小的、單獨的子程式可以縮小變數的作用域。
5、開始時使用最嚴格的可見性,然後根據需要擴充套件變數的作用域。當對變數作用域猶豫不決時,應該傾向於選擇該變數所能具有的最小的作用域:首先將變數限制於某個特定的迴圈,然後是侷限於某個子程式,其次是類的private變數,protected變數,再其次對包()可見,最後不得已的情況下再把它作為全域性變數。
關於對變數作用域的態度,取決於程式設計師如何看待「方便性」和「智力上的可管理性」。作用域越大,在寫**時越方便。但是寫出的程式更難於理解、閱讀、除錯和維護。
1.1.3 結論
1、 全域性變數在所有的檔案都可見,那他的作用域就是所有檔案。
2、 static定義的全域性變數,只在定義它的原始檔中可見,那他的作用域就是其所在的原始檔。
3、 函式內部的區域性變數,只在其函式範圍內可見。
4、 有些變數,只在某一塊**段內可見(花括號括起來的一段**)。
5、 盡量使變數的引用區域性化。
6、 盡量縮短變數的存活時間。
7、 儘量減少變數的作用域。
1.1.4 擴充套件閱讀
《**大全》第10章《使用變數的一般事項》會教你如何更好的使用變數。
深入剖析C 中的引用變數( )
函式的引數分為形參 parameters 和實參 arguments 在閱讀英文注釋或者檢視英文 的時候,可能常常會遇到這兩個單詞,應當知曉它們的區別。前者是在函式定義的時候採用的變數名,並沒有什麼實際的意義。後者則是在函式呼叫的時候實際傳入的引數。函式的引數傳遞方式可以分為值傳遞 指標傳遞和引用傳...
深入解讀C 中的指標變數
指標變數是一種特殊的變數,它和以前學過的其他型別的變數的不同之處是 用它來指向另乙個變數。為了表示指標變數和它所指向的變數之間的聯絡,在c 中用 符號表示指向,例如,i pointer是乙個指標變數,而 i pointer表示i pointer所指向的變數。下面兩個語句作用相同 i 3 i poin...
C 學習類的深入
1.建構函式初始化表 之前的類的建構函式的初始化都是使用賦值 來完成 對於常量和引用引數,簡單的賦值 是不足夠的。1 初始化列表 賦值有顯式和隱式賦值兩種。之前的類的初始化如 現在,採用一種初始化列表 如上圖所示,初始化列表位於建構函式的引數之後,以 標誌,每個變數的初始化採用隱式賦值,變數直接以逗...