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

字號(hào):

1、盡量不要在你的代碼中使用無(wú)符號(hào)類型,以免增加不比要的復(fù)雜性。尤其是不要僅僅因?yàn)闊o(wú)符號(hào)書(shū)不存在負(fù)值(如年齡、國(guó)債)而用它來(lái)表示數(shù)量。盡量使用int那樣的有符號(hào)類型,這樣在涉及升級(jí)混合類型的復(fù)雜細(xì)節(jié)時(shí),不必?fù)?dān)心邊界情況(如-1被翻譯為非常大的正數(shù))。只有在使用位段和二進(jìn)制掩碼時(shí),才可以用無(wú)符號(hào)數(shù),應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,使操作數(shù)均為有符號(hào)或者無(wú)符號(hào)數(shù)。
    2、這也是為什么C++ 語(yǔ)言令人失望的原因:它對(duì)C語(yǔ)言中存在的一些最基本的問(wèn)題沒(méi)有什么改進(jìn),而它對(duì)C語(yǔ)言最重要的擴(kuò)展(類)卻是建立在脆弱的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;
    }
    注意字符串?dāng)?shù)組的定義,最后那個(gè)逗號(hào),還有"Cray"后頭沒(méi)有逗號(hào)其實(shí)avarsc是個(gè)字符指針的指針。
    曾經(jīng)寫(xiě)過(guò)一個(gè)這樣錯(cuò)誤的代碼,要為一個(gè)字符串: "" 申請(qǐng)空間,應(yīng)該是STRLEN("\"\"")卻寫(xiě)成了STRLEN(""""),編譯沒(méi)有錯(cuò)誤,也就沒(méi)有注意,在后來(lái)走查代碼的時(shí)候,發(fā)現(xiàn)了錯(cuò)誤的地方,多虧為它多申請(qǐng)了不少空間,不然這又是個(gè)難以察覺(jué)的內(nèi)存錯(cuò)誤。
    4、全局變量由C編譯程序在動(dòng)態(tài)區(qū)之外的固定存儲(chǔ)區(qū)域中存儲(chǔ)。當(dāng)程序中多個(gè)函數(shù)都使用同一數(shù)據(jù)時(shí),全局變量將是很有效的。然而,由于三種原因,應(yīng)避免使用不必要的全局變量:
    ①不論是否需要,它們?cè)谡麄€(gè)程序執(zhí)行期間均占有存儲(chǔ)空間。
    ②由于全局變量必須依靠外部定義,所以在使用局部變量就可以達(dá)到其功能時(shí)使用了全局變量,將降低函數(shù)的通用性,這是因?yàn)樗蕾嚻浔旧碇獾臇|西。
    ③大量使用全局變量時(shí),不可知的和不需要的副作用將可能導(dǎo)致程序錯(cuò)誤。如在編制大型程序時(shí)有一個(gè)重要的問(wèn)題:變量值都有可能在程序其它地點(diǎn)偶然改變。
    5、在編譯時(shí)分配存儲(chǔ)空間的變量稱為靜態(tài)存儲(chǔ)變量,定義的靜態(tài)存儲(chǔ)變量無(wú)論是做全程量或是局部變量,其定義和初始化在程序編譯時(shí)進(jìn)行。作為局部變量,調(diào)用函數(shù)結(jié)束時(shí),靜態(tài)存儲(chǔ)變量不消失并且保留原值。
    補(bǔ)充:對(duì)于靜態(tài)全局變量,主要是為了保證性。
    補(bǔ)充:關(guān)于static的三點(diǎn)正確見(jiàn)解
    A、若全局變量?jī)H在單個(gè)C文件中訪問(wèn),則可以將這個(gè)變量修改為靜態(tài)全局變量,以降低模塊間的耦合度;
    B、若全局變量?jī)H由單個(gè)函數(shù)訪問(wèn),則可以將這個(gè)變量改為該函數(shù)的靜態(tài)局部變量,以降低模塊間的耦合度;
    C、設(shè)計(jì)和使用訪問(wèn)動(dòng)態(tài)全局變量、靜態(tài)全局變量、靜態(tài)局部變量的函數(shù)時(shí),需要考慮重入問(wèn)題;