有益的建議:
1.
變數(指標和陣列)被建立之後,應及時把它們初始化,以防止把未初始化的變數當成右值來使用。
2.當心變數的初值,預設值錯誤,或精度不夠。
3.當心資料型別轉換錯誤,盡量使用顯式的資料型別轉換,避免讓編譯器悄悄的進行隱式的資料型別轉換。
4.當心變數發生下溢或上溢,陣列的下標越界。
5.當心檔案
i/o有錯誤。
6.當心落掉「錯誤處理程式」,或「錯誤處理程式」本身有錯誤。
7.盡量不要使用與具體硬體或軟體環境關係密切的變數。
引用:1.例如
int m;int &n = m; 則n
是m 的乙個引用。
2.引用規則:
①引用被建立的同時必須被初始化。(指標可以在任何時候被初始化)②
不能有null
引用,引用必須與合法的儲存單元關聯(指標則可以
是null)③
一旦引用被初始化,就不能改變引用的關係。(指標可以是隨時
改變所指的物件)
函式的引數:
①
引數的書寫要完整,不能只寫引數型別而省略引數名字。
②引數命名要易懂,順序要合理,一般目的引數在前,源引數在後。
③若引數是指標,且僅做輸入用,應在型別前加
const
,以防止該指標在函式體內被修改。④
若輸入引數以值傳遞的方式傳遞物件,則應用
」const &」
方式來傳遞,可省去臨時物件
的構造和析構過程,提高效率。
返回值:
①
不要省略返回值型別。若沒有返回值,應宣告為
void
型別。②
正常輸出由輸出引數獲得,錯誤標誌用
return
語句返回。
③return
語句不能返回指向「棧記憶體」的指標或引用,因為該內存在函式體結束時自動銷 毀。
斷言(
assert):
是僅在debug
版本起作用的巨集,用於檢查不應該發生的情況。在編寫函式時,要反覆考查,並自問「我打算做哪些假定」,一旦確定了的假定,就要使用斷言對假定進行檢查。
記憶體分配方式:
①
從靜態儲存區域分配。
內存在程式編譯的時候就已經分配好,這塊內存在程式的整個
執行期間都存在,如全域性變數,
static
變數。②
在棧上建立。
函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時自動釋放。
③從堆上分配。
亦稱動態分配記憶體,用
malloc/free
或new/delete
。記憶體錯誤:
(1)記憶體分配未成功,卻使用了它。所以在使用記憶體前都要檢查指標是否為
null。(
2)記憶體分配成功,但未初始化。所以分配到的記憶體必須初始化,陣列賦為0值。
(3)記憶體分配成功且初始化,但操作越界。(4
)忘記釋放記憶體,導致「記憶體洩露」。所以
malloc/free
或者new/delete
配對使用。(5
)記憶體釋放卻仍使用它。原因可能為:
return
語句指向棧記憶體的指標被返回;釋放記憶體後,未將指標置為
null,
導致野指標。
指標與陣列:
(1)陣列要麼在靜態儲存區域建立,要麼在棧上建立,位址和容量不變,內容可變。指標則可指向任何記憶體塊。如:
chara = 「hello」;
a[0] = 『x』;//
正確char*p = 「world」;
p[0] = 』x』;//
錯誤,因為「
world
」為常量字串
char a = 「hello world」;
char *p = a;
則sizeof(a) = 12;//11+』/0』 = 12
sizeof(p) = 4;//sizeof(char *) = 4;
(2)若陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。
void func(char a[100])
指標作為函式的引數,不能指望用該指標去申請動態記憶體。如:
voidtest(void)
void getmemory( char *p, int num )
則str = null;
可採用指向指標的指標。
void test(void)
void getmemory(char **p, int num)
或者void test(void)
char *getmemory(int num)
《高質量c c程式設計指南》學習摘要
1.盡可能在定義變數的同時初始化該變數 就近原則 防止忘記初始化,引用未被初始化的變數,可能導致程式錯誤 2.行最大長度宜控制在70 80個字元以內 長行拆分 否則眼睛看不過來,也不便於列印。例如 virtual cmatrix cmultiplymatrix cmatrix leftmatrix,...
高質量c 程式設計指南摘要(一)(原創)
良好的程式設計習慣 一 類 封裝 讓模組僅僅分開必須讓外界知道的內容,而隱藏其他一切內容。繼承 1.若a類和b類毫不相關,不可讓b的功能多些而讓b去繼承a的功能和屬性。2.若邏輯上b是a的一種,且a的所有功能和屬性對b都有意義,則允許b 繼承a的功能和屬性。組合 若邏輯上a是b的一部分,則不允許b從...
高質量C C程式設計指南
1.如果引數是指標,且僅作輸入用,則應在型別前加const,以防止該指標在函式體內被意外修改 2.在函式體的 入口處 對引數的有效性進行檢查 在函式體的 出口處 對return語句的正確性和效率進行檢查 3.引用的一些規則如下 1 引用被建立的同時必須被初始化 指標則可以在任何時候被初始化 2 不能...