等級考試二級C專家編程讀書筆記(上)

字號:

1、盡量不要在你的代碼中使用無符號類型,以免增加不比要的復雜性。尤其是不要僅僅因為無符號書不存在負值(如年齡、國債)而用它來表示數(shù)量。盡量使用int那樣的有符號類型,這樣在涉及升級混合類型的復雜細節(jié)時,不必擔心邊界情況(如-1被翻譯為非常大的正數(shù))。只有在使用位段和二進制掩碼時,才可以用無符號數(shù),應該在表達式中使用強制類型轉(zhuǎn)換,使操作數(shù)均為有符號或者無符號數(shù)。
    2、這也是為什么C++ 語言令人失望的原因:它對C語言中存在的一些最基本的問題沒有什么改進,而它對C語言最重要的擴展(類)卻是建立在脆弱的C類型模型上。
    3、看一段代碼:
    int main(void)
    {
     int pa=0;
     char * avarsc[] =
     {
     "color monitor",
     "big disk",
     "Cray"
     "on-line drawing routhines",
     "mouse",
     "keyboard",
     "power cables",
     };
     char ** pp;
     pp = avarsc;
     printf("%s\n", avarsc[2]); // output Crayon-line drawing routhines
     printf("%s\n", *(pp++)); // output big disk
     scanf("%d", pa);
     return 1;
    }
    注意字符串數(shù)組的定義,最后那個逗號,還有"Cray"后頭沒有逗號其實avarsc是個字符指針的指針。
    曾經(jīng)寫過一個這樣錯誤的代碼,要為一個字符串: "" 申請空間,應該是STRLEN("\"\"")卻寫成了STRLEN(""""),編譯沒有錯誤,也就沒有注意,在后來走查代碼的時候,發(fā)現(xiàn)了錯誤的地方,多虧為它多申請了不少空間,不然這又是個難以察覺的內(nèi)存錯誤。
    4、全局變量由C編譯程序在動態(tài)區(qū)之外的固定存儲區(qū)域中存儲。當程序中多個函數(shù)都使用同一數(shù)據(jù)時,全局變量將是很有效的。然而,由于三種原因,應避免使用不必要的全局變量:
    ①不論是否需要,它們在整個程序執(zhí)行期間均占有存儲空間。
    ②由于全局變量必須依靠外部定義,所以在使用局部變量就可以達到其功能時使用了全局變量,將降低函數(shù)的通用性,這是因為它要依賴其本身之外的東西。
    ③大量使用全局變量時,不可知的和不需要的副作用將可能導致程序錯誤。如在編制大型程序時有一個重要的問題:變量值都有可能在程序其它地點偶然改變。
    5、在編譯時分配存儲空間的變量稱為靜態(tài)存儲變量,定義的靜態(tài)存儲變量無論是做全程量或是局部變量,其定義和初始化在程序編譯時進行。作為局部變量,調(diào)用函數(shù)結(jié)束時,靜態(tài)存儲變量不消失并且保留原值。
    補充:對于靜態(tài)全局變量,主要是為了保證性。
    補充:關(guān)于static的三點正確見解
    A、若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態(tài)全局變量,以降低模塊間的耦合度;
    B、若全局變量僅由單個函數(shù)訪問,則可以將這個變量改為該函數(shù)的靜態(tài)局部變量,以降低模塊間的耦合度;
    C、設計和使用訪問動態(tài)全局變量、靜態(tài)全局變量、靜態(tài)局部變量的函數(shù)時,需要考慮重入問題;