舉報(bào)

會(huì)員
編寫高質(zhì)量代碼:改善C程序代碼的125個(gè)建議
馬偉 著 著
更新時(shí)間:2019-01-01 01:34:07
開會(huì)員,本書免費(fèi)讀 >
最新章節(jié):
建議125:謹(jǐn)慎程序中嵌入?yún)R編代碼
本書適合那些有一定C語言基礎(chǔ)并希望快速提升程序設(shè)計(jì)能力的初級(jí)與中級(jí)程序員。因此,本書并不會(huì)闡述C語言中的一些基礎(chǔ)概念,而是將C語言編程過程中可能遇到的疑問或者障礙進(jìn)行一一列舉與剖析,并給出了經(jīng)驗(yàn)性解決方案與建議。
最新章節(jié)
- 建議125:謹(jǐn)慎程序中嵌入?yún)R編代碼
- 建議124:避免不必要的函數(shù)調(diào)用
- 建議123:謹(jǐn)慎使用標(biāo)準(zhǔn)函數(shù)庫
- 建議122:謹(jǐn)慎設(shè)計(jì)函數(shù)參數(shù)的順序和個(gè)數(shù)
- 建議121:避免在函數(shù)內(nèi)定義占用內(nèi)存很大的局部變量
- 建議120:謹(jǐn)慎使用內(nèi)聯(lián)函數(shù)
品牌:機(jī)械工業(yè)出版社
上架時(shí)間:2016-04-08 12:11:48
出版社:機(jī)械工業(yè)出版社
本書數(shù)字版權(quán)由機(jī)械工業(yè)出版社提供,并由其授權(quán)上海閱文信息技術(shù)有限公司制作發(fā)行
- 建議125:謹(jǐn)慎程序中嵌入?yún)R編代碼 更新時(shí)間:2019-01-01 01:34:07
- 建議124:避免不必要的函數(shù)調(diào)用
- 建議123:謹(jǐn)慎使用標(biāo)準(zhǔn)函數(shù)庫
- 建議122:謹(jǐn)慎設(shè)計(jì)函數(shù)參數(shù)的順序和個(gè)數(shù)
- 建議121:避免在函數(shù)內(nèi)定義占用內(nèi)存很大的局部變量
- 建議120:謹(jǐn)慎使用內(nèi)聯(lián)函數(shù)
- 建議119:避免錯(cuò)誤地變量初始化
- 第15章 保持良好的設(shè)計(jì)
- 建議118:使用_Noreturn標(biāo)識(shí)不返回值的函數(shù)
- 建議117:使用靜態(tài)斷言_Static_assert執(zhí)行編譯時(shí)檢查
- 建議116:了解C11多線程編程
- 建議115:盡量使用帶邊界檢查的字符串操作函數(shù)
- 建議114:盡量使用gets_s替換gets函數(shù)
- 建議113:謹(jǐn)慎使用_Generic
- 第14章 了解C11標(biāo)準(zhǔn)
- 建議112:避免以遞歸方式調(diào)用raise函數(shù)
- 建議111:避免在信號(hào)處理函數(shù)內(nèi)部訪問或修改共享對(duì)象
- 建議110:盡量使用sigaction替代signal
- 建議109:理解信號(hào)
- 第13章 信號(hào)處理
- 建議108:避免calloc參數(shù)相乘的值超過size_t表示的范圍
- 建議107:避免內(nèi)存泄漏
- 建議106-4:避免忽略字符串最后的'\0'字符而導(dǎo)致的越界
- 建議106-3:避免memcpy與memset函數(shù)長度越界
- 建議106-2:避免sprintf、vsprintf、strcpy、strcat與gets越界
- 建議106-1:避免數(shù)組越界
- 建議106:避免內(nèi)存越界
- 建議105-2:在free之后必須為指針賦一個(gè)新值
- 建議105-1:malloc等內(nèi)存分配函數(shù)與free必須配對(duì)使用
- 建議105:確保安全釋放內(nèi)存
- 建議104-8:避免內(nèi)存分配成功,但并未初始化
- 建議104-7:避免大型的堆棧分配
- 建議104-6:禁止執(zhí)行零長度的內(nèi)存分配
- 建議104-5:確保為對(duì)象分配足夠的內(nèi)存空間
- 建議104-4:確保指針指向一塊合法的內(nèi)存
- 建議104-3:必須對(duì)內(nèi)存分配函數(shù)的返回指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- 建議104-2:內(nèi)存資源的分配與釋放應(yīng)該限定在同一模塊或者同一抽象層內(nèi)進(jìn)行
- 建議104-1:對(duì)內(nèi)存分配函數(shù)的返回值必須進(jìn)行檢查
- 建議104:避免錯(cuò)誤分配內(nèi)存
- 建議103:淺談堆和棧
- 建議102:淺談程序的內(nèi)存結(jié)構(gòu)
- 第12章 內(nèi)存管理
- 建議101:盡量避免使用setjmp與longjmp組合
- 建議100:盡量避免使用goto進(jìn)行出錯(cuò)跳轉(zhuǎn)
- 建議99:謹(jǐn)慎使用函數(shù)的返回值來標(biāo)志函數(shù)是否執(zhí)行成功
- 建議98-3:避免使用errno檢查文件流錯(cuò)誤
- 建議98-2:避免重定義errno
- 建議98-1:調(diào)用errno之前必須先將其清零
- 建議98:謹(jǐn)慎使用errno
- 建議97-7:謹(jǐn)慎使用斷言對(duì)程序開發(fā)環(huán)境中的假設(shè)進(jìn)行檢查
- 建議97-6:用斷言保證沒有定義的特性或功能不被使用
- 建議97-5:盡量在防錯(cuò)性程序設(shè)計(jì)中使用斷言來進(jìn)行錯(cuò)誤報(bào)警
- 建議97-4:避免使用斷言去檢查程序錯(cuò)誤
- 建議97-3:避免在斷言表達(dá)式中使用改變環(huán)境的語句
- 建議97-2:盡量在函數(shù)中使用斷言來檢查參數(shù)的合法性
- 建議97-1:盡量利用斷言來提高代碼的可測試性
- 建議97:謹(jǐn)慎使用斷言
- 第11章 斷言與異常處理
- 建議96:盡量避免在一個(gè)函數(shù)塊中單獨(dú)使用“#define”或“#undef”
- 建議95-3:妙用“defined”
- 建議95-2:使用條件編譯指令實(shí)現(xiàn)源代碼的部分編譯
- 建議95-1:使用“#ifndef/#define/#endif”防止頭文件被重復(fù)引用
- 建議95:掌握條件編譯指令
- 建議94-2:必須保證頭文件名稱的唯一性
- 建議94-1:區(qū)別“#include<filename.h>”與“#include"filename.h"”
- 建議94:謹(jǐn)慎使用“#include”
- 建議93:掌握預(yù)定義宏
- 建議92:盡量使用內(nèi)聯(lián)函數(shù)代替宏
- 建議91:合理地選擇函數(shù)與宏
- 建議90-3:避免使用宏創(chuàng)建一種“新語言”
- 建議90-2:盡量消除宏的副作用
- 建議90-1:在使用宏定義表達(dá)式時(shí)必須使用完備的括號(hào)
- 建議90:謹(jǐn)慎宏定義
- 第10章 預(yù)處理器
- 建議89:謹(jǐn)慎rename函數(shù)重命名已經(jīng)存在的文件
- 建議88:謹(jǐn)慎remove函數(shù)刪除已打開的文件
- 建議87:盡量使用setvbuf替換setbuf函數(shù)
- 建議86:盡量使用fseek替換rewind函數(shù)
- 建議85:盡量使用fread與fwrite函數(shù)來讀寫二進(jìn)制文件
- 建議84-3:區(qū)別vprintf/vscanf、vfprintf/vfscanf、vsprintf/vsscanf和vsnprintf
- 建議84-2:盡量使用snprintf替代sprintf函數(shù)
- 建議84-1:區(qū)別printf/scanf、fprintf/fscanf和sprintf/sscanf
- 建議84:區(qū)別格式化讀寫函數(shù)
- 建議83:合理選擇單個(gè)字符讀寫函數(shù)
- 建議82:盡量使用fputs替換puts函數(shù)
- 建議81:盡量使用fgets替換gets函數(shù)
- 建議80:盡量使用feof和ferror檢測文件結(jié)束和錯(cuò)誤
- 建議79:正確理解EOF宏
- 建議78:文件操作完成后必須關(guān)閉
- 建議77-5:區(qū)別fopen與freopen函數(shù)
- 建議77-4:區(qū)別fopen與fopen_s函數(shù)
- 建議77-3:盡量避免重復(fù)打開已經(jīng)被打開的文件
- 建議77-2:必須檢查fopen函數(shù)的返回值
- 建議77-1:正確指定fopen的mode參數(shù)
- 建議77:謹(jǐn)慎文件打開操作
- 建議76:謹(jǐn)慎使用printf和scanf函數(shù)
- 第9章 文件系統(tǒng)
- 建議75-4:區(qū)別strspn與strcspn函數(shù)
- 建議75-3:使用strstr函數(shù)查找一個(gè)子串
- 建議75-2:使用strpbrk函數(shù)查找多個(gè)字符
- 建議75-1:使用strchr與strrchr函數(shù)查找單個(gè)字符
- 建議75:掌握字符串查找技術(shù)
- 建議74:謹(jǐn)慎strtok函數(shù)的不可重入性
- 建議73-5:避免strcat函數(shù)發(fā)生內(nèi)存重疊與溢出
- 建議73-4:區(qū)別字符串比較與內(nèi)存比較
- 建議73-3:避免strcpy與memcpy函數(shù)內(nèi)存重疊
- 建議73-2:區(qū)別串拷貝strcpy與內(nèi)存拷貝memcpy
- 建議73-1:避免字符串拷貝發(fā)生溢出
- 建議73:在使用不受限制的字符串函數(shù)時(shí),必須保證結(jié)果字符串不會(huì)溢出內(nèi)存
- 建議72:區(qū)別strlen函數(shù)與sizeof運(yùn)算符
- 建議71:盡量使用const指針來引用字符串常量
- 建議70-3:謹(jǐn)慎字符數(shù)組的初始化
- 建議70-2:字符數(shù)組必須能夠同時(shí)容納字符數(shù)據(jù)和null結(jié)尾符
- 建議70-1:正確認(rèn)識(shí)字符數(shù)組和字符串
- 建議70:不要忽視字符串的null('\0')結(jié)尾符
- 第8章 字符與字符串
- 建議69:深入理解結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針
- 建議68:禁止在位域成員上調(diào)用offsetof宏
- 建議67:謹(jǐn)慎使用枚舉
- 建議66:謹(jǐn)慎使用位域
- 建議65:避免在結(jié)構(gòu)體之間執(zhí)行逐字節(jié)比較
- 建議64:結(jié)構(gòu)體的長度不一定等于各個(gè)成員的長度之和
- 建議63:合理利用結(jié)構(gòu)體內(nèi)存對(duì)齊原理來提高程序效率
- 建議62-4:合理劃分與改進(jìn)結(jié)構(gòu)體以提高空間效率
- 建議62-3:盡量使結(jié)構(gòu)體中元素的個(gè)數(shù)適中
- 建議62-2:盡量減小結(jié)構(gòu)體間關(guān)系的復(fù)雜度
- 建議62-1:盡量使結(jié)構(gòu)體的功能單一
- 建議62:結(jié)構(gòu)體的設(shè)計(jì)要遵循簡單、單一原則
- 第7章 結(jié)構(gòu)、位域和枚舉
- 建議61:深入理解數(shù)組參數(shù)
- 建議60:區(qū)別指針數(shù)組和數(shù)組指針
- 建議59:細(xì)說緩沖區(qū)溢出
- 建議58:若結(jié)果值并不引用合法的數(shù)組元素,不要將指針加上或減去一個(gè)整數(shù)
- 建議57:禁止對(duì)兩個(gè)并不指向同一個(gè)數(shù)組的指針進(jìn)行相減或比較
- 建議56:禁止將一個(gè)指向非數(shù)組對(duì)象的指針加上或減去一個(gè)整數(shù)
- 建議55:理解數(shù)組與指針的可交換性
- 建議54:數(shù)組并非指針
- 建議53-3:獲取數(shù)組的長度時(shí)不要對(duì)指針應(yīng)用sizeof操作符
- 建議53-2:對(duì)數(shù)組做越界檢查,確保索引值位于合法的范圍之內(nèi)
- 建議53-1:盡量顯式地指定數(shù)組的邊界
- 建議53:避免數(shù)組越界
- 建議52-3:理解數(shù)組名a作為右值和左值的區(qū)別
- 建議52-2:理解&a[0]和&a的區(qū)別
- 建議52-1:理解數(shù)組的存儲(chǔ)布局
- 建議52:理解數(shù)組的存儲(chǔ)實(shí)質(zhì)
- 第6章 數(shù)組并非指針
- 建議51-4:盡量避免使用可變參數(shù)
- 建議51-3:如果函數(shù)的參數(shù)是指針,避免用該指針去申請(qǐng)動(dòng)態(tài)內(nèi)存
- 建議51-2:掌握函數(shù)的參數(shù)傳遞方式
- 建議51-1:理解函數(shù)參數(shù)的傳遞過程
- 建議51:深入理解函數(shù)參數(shù)的傳遞方式
- 建議50:區(qū)別“const int*p”與“int*const p”
- 建議49:謹(jǐn)慎指針與整數(shù)之間的轉(zhuǎn)換
- 建議48:避免將一種類型的操作符應(yīng)用于另一種不兼容的類型
- 建議47:避免把指針轉(zhuǎn)換為對(duì)齊要求更嚴(yán)格的指針類型
- 建議46:避免使用指針的長度確定它所指向類型的長度
- 建議45-2:如果函數(shù)的參數(shù)可以是任意類型指針,應(yīng)該將其參數(shù)聲明為void*
- 建議45-1:避免對(duì)void指針進(jìn)行算術(shù)操作
- 建議45:謹(jǐn)慎使用void指針
- 建議44-5:避免對(duì)NULL指針進(jìn)行解引用
- 建議44-4:用NULL指針作警戒值
- 建議44-3:用NULL指針作函數(shù)調(diào)用失敗時(shí)的返回值
- 建議44-2:用NULL指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用
- 建議44-1:區(qū)別空(null)指針與NULL指針的概念
- 建議44:理解空(null)指針與NULL指針
- 建議43:區(qū)別“int*p=NULL”和“*p=NULL”
- 建議42:指針變量必須初始化
- 建議41:理解指針變量的存儲(chǔ)實(shí)質(zhì)
- 第5章 不會(huì)使用指針的程序員是不合格的
- 建議40:盡量使用inline內(nèi)聯(lián)函數(shù)來替代#define宏
- 建議39:盡量減少函數(shù)本身或者函數(shù)間的遞歸調(diào)用
- 建議38:在調(diào)用函數(shù)時(shí),必須對(duì)返回值進(jìn)行判斷,同時(shí)對(duì)錯(cuò)誤的返回值還要有相應(yīng)的錯(cuò)誤處理
- 建議37-2:盡量在函數(shù)體出口處對(duì)return語句做安全性檢查
- 建議37-1:盡量在函數(shù)體入口處對(duì)參數(shù)做有效性檢查
- 建議37:確保函數(shù)體的“入口”與“出口”安全性
- 建議36:沒有返回值的函數(shù)應(yīng)聲明為void類型
- 建議35-4:使用const防止指針類型的輸入?yún)?shù)在函數(shù)體內(nèi)被意外修改
- 建議35-3:避免將函數(shù)的參數(shù)作為工作變量
- 建議35-2:盡量避免在非調(diào)度函數(shù)中使用控制參數(shù)
- 建議35-1:沒有參數(shù)的函數(shù)必須使用void填充
- 建議35:盡量避免設(shè)計(jì)多參數(shù)函數(shù)
- 建議34-5:理解可重入函數(shù)與線程安全函數(shù)之間的關(guān)系
- 建議34-4:對(duì)于全局變量,應(yīng)通過互斥信號(hào)量(即P、V操作)或者中斷機(jī)制等方法來保證函數(shù)的線程安全
- 建議34-3:避免調(diào)用任何不可重入函數(shù)
- 建議34-2:避免函數(shù)返回指向靜態(tài)數(shù)據(jù)的指針
- 建議34-1:避免在函數(shù)中使用static局部變量
- 建議34:盡量避免編寫不可重入函數(shù)
- 建議33:避免多段代碼重復(fù)做同一件事情
- 建議32:盡可能為簡單功能編寫函數(shù)
- 建議31:函數(shù)的抽象級(jí)別應(yīng)該在同一層次
- 建議30:避免把沒有關(guān)聯(lián)的語句放在一個(gè)函數(shù)中
- 建議29:盡量使函數(shù)的功能單一
- 建議28:理解函數(shù)原型
- 建議27:理解函數(shù)聲明
- 第4章 函數(shù)同樣需要保持簡潔高效
- 建議26:區(qū)別continue與break語句
- 建議25:盡量避免使用goto語句
- 建議24-3:盡量根據(jù)發(fā)生頻率來排列各條case語句
- 建議24-2:盡量將情況正常的case語句排在最前面
- 建議24-1:盡量按照字母或數(shù)字順序來排列各條case語句
- 建議24:選擇合理的case語句排序方法
- 建議23-4:盡量將長的switch語句轉(zhuǎn)換為嵌套的switch語句
- 建議23-3:不要為了使用case語句而刻意構(gòu)造一個(gè)變量
- 建議23-2:不要忘記在switch語句的結(jié)尾添加default語句
- 建議23-1:不要忘記在case語句的結(jié)尾添加break語句
- 建議23:正確地使用switch語句
- 建議22-2:優(yōu)先使用for循環(huán)替代do/while與while循環(huán)
- 建議22-1:無限循環(huán)優(yōu)先選用for(;;),而不是while(1)
- 建議22:謹(jǐn)慎使用do/while與while循環(huán)
- 建議21:適當(dāng)?shù)厥褂貌⑿写a來優(yōu)化for循環(huán)
- 建議20-6:盡量將循環(huán)嵌套控制在3層以內(nèi)
- 建議20-5:盡量將多重循環(huán)中最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層
- 建議20-4:盡量使邏輯判斷語句置于循環(huán)語句外層
- 建議20-3:避免在循環(huán)體內(nèi)修改循環(huán)變量
- 建議20-2:盡量使循環(huán)體內(nèi)工作量達(dá)到最小化
- 建議20-1:盡量使循環(huán)控制變量的取值采用半開半閉區(qū)間寫法
- 建議20:正確使用for循環(huán)
- 建議19:避免使用嵌套的“?:”
- 建議18-4:指針變量應(yīng)該用“==”或“!=”與NULL進(jìn)行比較
- 建議18-3:避免浮點(diǎn)變量用“==”或“!=”與0進(jìn)行比較
- 建議18-2:整型變量應(yīng)該直接與0進(jìn)行比較
- 建議18-1:避免布爾型與0或1進(jìn)行比較
- 建議18:謹(jǐn)慎0值比較
- 建議17-4:對(duì)深層嵌套的if語句進(jìn)行重構(gòu)
- 建議17-3:避免在if/else語句后面添加分號(hào)“;”
- 建議17-2:避免“懸掛”的else
- 建議17-1:先處理正常情況,再處理異常情況
- 建議17:if語句應(yīng)該盡量保持簡潔,減少嵌套的層數(shù)
- 第3章 程序控制語句應(yīng)該保持簡潔高效
- 建議16-3:盡量避免在表達(dá)式中使用默認(rèn)的優(yōu)先級(jí)
- 建議16-2:盡量避免編寫多用途的、太復(fù)雜的復(fù)合表達(dá)式
- 建議16-1:盡量使用復(fù)合賦值運(yùn)算符
- 建議16:表達(dá)式的設(shè)計(jì)應(yīng)該兼顧效率與可讀性
- 建議15-3:避免“&”與“&&”混淆
- 建議15-2:避免“|”與“||”混淆
- 建議15-1:避免“=”與“==”混淆
- 建議15:避免操作符混淆
- 建議14-4:盡量避免在同一個(gè)數(shù)據(jù)上執(zhí)行位操作與算術(shù)運(yùn)算
- 建議14-3:移位的數(shù)量必須大于等于0且小于操作數(shù)的位數(shù)
- 建議14-2:在右移中合理地選擇0或符號(hào)位來填充空出的位
- 建議14-1:盡量避免對(duì)未知的有符號(hào)數(shù)執(zhí)行位操作
- 建議14:適當(dāng)?shù)厥褂梦徊僮鱽硖岣哂?jì)算效率
- 建議13:保證除法和求模運(yùn)算不會(huì)導(dǎo)致除零錯(cuò)誤
- 建議12-5:盡量將浮點(diǎn)除法轉(zhuǎn)化為相應(yīng)的整數(shù)除法運(yùn)算
- 建議12-4:用移位運(yùn)算實(shí)現(xiàn)乘除法運(yùn)算
- 建議12-3:用減法運(yùn)算來實(shí)現(xiàn)整數(shù)除法運(yùn)算
- 建議12-2:使用牛頓迭代法求除數(shù)的倒數(shù)
- 建議12-1:用倒數(shù)相乘來實(shí)現(xiàn)除法運(yùn)算
- 建議12:盡量減少使用除法運(yùn)算與求模運(yùn)算
- 第2章 保持嚴(yán)謹(jǐn)?shù)某绦蛟O(shè)計(jì),一切從表達(dá)式開始做起
- 建議11:盡量使用const聲明值不會(huì)改變的變量
- 建議10:盡量少使用全局變量
- 建議9:盡量不要在可重入函數(shù)中使用靜態(tài)(或全局)變量
- 建議8-4:盡量少使用register變量
- 建議8-3:不要混淆static變量的作用
- 建議8-2:慎用extern聲明外部變量
- 建議8-1:定義局部變量時(shí)應(yīng)該省略auto關(guān)鍵字
- 建議8:正確地選擇變量的存儲(chǔ)類型
- 建議7-2:避免在嵌套的代碼塊之間使用相同的變量名
- 建議7-1:盡量不要在一個(gè)聲明中聲明超過一個(gè)的變量
- 建議7:變量聲明應(yīng)該力求簡潔
- 建議6-3:typedef不同于#define
- 建議6-2:小心使用typedef帶來的陷阱
- 建議6-1:掌握typedef的4種應(yīng)用形式
- 建議6:使用typedef來定義類型的新別名
- 建議5:使用有嚴(yán)格定義的數(shù)據(jù)類型
- 建議4-2:浮點(diǎn)數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查
- 建議4-1:整數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查
- 建議4:數(shù)據(jù)類型轉(zhuǎn)換必須做范圍檢查
- 建議3-6:盡量將浮點(diǎn)運(yùn)算中的整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)
- 建議3-5:避免使用浮點(diǎn)數(shù)作為循環(huán)計(jì)數(shù)器
- 建議3-4:避免直接在浮點(diǎn)數(shù)中使用“==”操作符做相等判斷
- 建議3-3:使用分?jǐn)?shù)來精確表達(dá)浮點(diǎn)數(shù)
- 建議3-2:避免使用浮點(diǎn)數(shù)進(jìn)行精確計(jì)算
- 建議3-1:了解IEEE 754浮點(diǎn)數(shù)
- 建議3:盡量少使用浮點(diǎn)類型
- 建議2-7:防止有符號(hào)整數(shù)溢出
- 建議2-6:防止無符號(hào)整數(shù)回繞
- 建議2-5:小心使用無符號(hào)類型帶來的陷阱
- 建議2-4:禁止把size_t類型和它所代表的真實(shí)類型混用
- 建議2-3:使用rsize_t或size_t類型來表示一個(gè)對(duì)象所占用空間的整數(shù)值單位
- 建議2-2:使用顯式聲明為signed char或unsigned char的類型來執(zhí)行算術(shù)運(yùn)算
- 建議2-1:char類型變量的值應(yīng)該限制在signed char與unsigned char的交集范圍內(nèi)
- 建議2:防止整數(shù)類型產(chǎn)生回繞與溢出
- 建議1:認(rèn)識(shí)ANSI C
- 第1章 數(shù)據(jù),程序設(shè)計(jì)之根本
- 前言
- 版權(quán)信息
- 封面
- 封面
- 版權(quán)信息
- 前言
- 第1章 數(shù)據(jù),程序設(shè)計(jì)之根本
- 建議1:認(rèn)識(shí)ANSI C
- 建議2:防止整數(shù)類型產(chǎn)生回繞與溢出
- 建議2-1:char類型變量的值應(yīng)該限制在signed char與unsigned char的交集范圍內(nèi)
- 建議2-2:使用顯式聲明為signed char或unsigned char的類型來執(zhí)行算術(shù)運(yùn)算
- 建議2-3:使用rsize_t或size_t類型來表示一個(gè)對(duì)象所占用空間的整數(shù)值單位
- 建議2-4:禁止把size_t類型和它所代表的真實(shí)類型混用
- 建議2-5:小心使用無符號(hào)類型帶來的陷阱
- 建議2-6:防止無符號(hào)整數(shù)回繞
- 建議2-7:防止有符號(hào)整數(shù)溢出
- 建議3:盡量少使用浮點(diǎn)類型
- 建議3-1:了解IEEE 754浮點(diǎn)數(shù)
- 建議3-2:避免使用浮點(diǎn)數(shù)進(jìn)行精確計(jì)算
- 建議3-3:使用分?jǐn)?shù)來精確表達(dá)浮點(diǎn)數(shù)
- 建議3-4:避免直接在浮點(diǎn)數(shù)中使用“==”操作符做相等判斷
- 建議3-5:避免使用浮點(diǎn)數(shù)作為循環(huán)計(jì)數(shù)器
- 建議3-6:盡量將浮點(diǎn)運(yùn)算中的整數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)
- 建議4:數(shù)據(jù)類型轉(zhuǎn)換必須做范圍檢查
- 建議4-1:整數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查
- 建議4-2:浮點(diǎn)數(shù)轉(zhuǎn)換為新類型時(shí)必須做范圍檢查
- 建議5:使用有嚴(yán)格定義的數(shù)據(jù)類型
- 建議6:使用typedef來定義類型的新別名
- 建議6-1:掌握typedef的4種應(yīng)用形式
- 建議6-2:小心使用typedef帶來的陷阱
- 建議6-3:typedef不同于#define
- 建議7:變量聲明應(yīng)該力求簡潔
- 建議7-1:盡量不要在一個(gè)聲明中聲明超過一個(gè)的變量
- 建議7-2:避免在嵌套的代碼塊之間使用相同的變量名
- 建議8:正確地選擇變量的存儲(chǔ)類型
- 建議8-1:定義局部變量時(shí)應(yīng)該省略auto關(guān)鍵字
- 建議8-2:慎用extern聲明外部變量
- 建議8-3:不要混淆static變量的作用
- 建議8-4:盡量少使用register變量
- 建議9:盡量不要在可重入函數(shù)中使用靜態(tài)(或全局)變量
- 建議10:盡量少使用全局變量
- 建議11:盡量使用const聲明值不會(huì)改變的變量
- 第2章 保持嚴(yán)謹(jǐn)?shù)某绦蛟O(shè)計(jì),一切從表達(dá)式開始做起
- 建議12:盡量減少使用除法運(yùn)算與求模運(yùn)算
- 建議12-1:用倒數(shù)相乘來實(shí)現(xiàn)除法運(yùn)算
- 建議12-2:使用牛頓迭代法求除數(shù)的倒數(shù)
- 建議12-3:用減法運(yùn)算來實(shí)現(xiàn)整數(shù)除法運(yùn)算
- 建議12-4:用移位運(yùn)算實(shí)現(xiàn)乘除法運(yùn)算
- 建議12-5:盡量將浮點(diǎn)除法轉(zhuǎn)化為相應(yīng)的整數(shù)除法運(yùn)算
- 建議13:保證除法和求模運(yùn)算不會(huì)導(dǎo)致除零錯(cuò)誤
- 建議14:適當(dāng)?shù)厥褂梦徊僮鱽硖岣哂?jì)算效率
- 建議14-1:盡量避免對(duì)未知的有符號(hào)數(shù)執(zhí)行位操作
- 建議14-2:在右移中合理地選擇0或符號(hào)位來填充空出的位
- 建議14-3:移位的數(shù)量必須大于等于0且小于操作數(shù)的位數(shù)
- 建議14-4:盡量避免在同一個(gè)數(shù)據(jù)上執(zhí)行位操作與算術(shù)運(yùn)算
- 建議15:避免操作符混淆
- 建議15-1:避免“=”與“==”混淆
- 建議15-2:避免“|”與“||”混淆
- 建議15-3:避免“&”與“&&”混淆
- 建議16:表達(dá)式的設(shè)計(jì)應(yīng)該兼顧效率與可讀性
- 建議16-1:盡量使用復(fù)合賦值運(yùn)算符
- 建議16-2:盡量避免編寫多用途的、太復(fù)雜的復(fù)合表達(dá)式
- 建議16-3:盡量避免在表達(dá)式中使用默認(rèn)的優(yōu)先級(jí)
- 第3章 程序控制語句應(yīng)該保持簡潔高效
- 建議17:if語句應(yīng)該盡量保持簡潔,減少嵌套的層數(shù)
- 建議17-1:先處理正常情況,再處理異常情況
- 建議17-2:避免“懸掛”的else
- 建議17-3:避免在if/else語句后面添加分號(hào)“;”
- 建議17-4:對(duì)深層嵌套的if語句進(jìn)行重構(gòu)
- 建議18:謹(jǐn)慎0值比較
- 建議18-1:避免布爾型與0或1進(jìn)行比較
- 建議18-2:整型變量應(yīng)該直接與0進(jìn)行比較
- 建議18-3:避免浮點(diǎn)變量用“==”或“!=”與0進(jìn)行比較
- 建議18-4:指針變量應(yīng)該用“==”或“!=”與NULL進(jìn)行比較
- 建議19:避免使用嵌套的“?:”
- 建議20:正確使用for循環(huán)
- 建議20-1:盡量使循環(huán)控制變量的取值采用半開半閉區(qū)間寫法
- 建議20-2:盡量使循環(huán)體內(nèi)工作量達(dá)到最小化
- 建議20-3:避免在循環(huán)體內(nèi)修改循環(huán)變量
- 建議20-4:盡量使邏輯判斷語句置于循環(huán)語句外層
- 建議20-5:盡量將多重循環(huán)中最長的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層
- 建議20-6:盡量將循環(huán)嵌套控制在3層以內(nèi)
- 建議21:適當(dāng)?shù)厥褂貌⑿写a來優(yōu)化for循環(huán)
- 建議22:謹(jǐn)慎使用do/while與while循環(huán)
- 建議22-1:無限循環(huán)優(yōu)先選用for(;;),而不是while(1)
- 建議22-2:優(yōu)先使用for循環(huán)替代do/while與while循環(huán)
- 建議23:正確地使用switch語句
- 建議23-1:不要忘記在case語句的結(jié)尾添加break語句
- 建議23-2:不要忘記在switch語句的結(jié)尾添加default語句
- 建議23-3:不要為了使用case語句而刻意構(gòu)造一個(gè)變量
- 建議23-4:盡量將長的switch語句轉(zhuǎn)換為嵌套的switch語句
- 建議24:選擇合理的case語句排序方法
- 建議24-1:盡量按照字母或數(shù)字順序來排列各條case語句
- 建議24-2:盡量將情況正常的case語句排在最前面
- 建議24-3:盡量根據(jù)發(fā)生頻率來排列各條case語句
- 建議25:盡量避免使用goto語句
- 建議26:區(qū)別continue與break語句
- 第4章 函數(shù)同樣需要保持簡潔高效
- 建議27:理解函數(shù)聲明
- 建議28:理解函數(shù)原型
- 建議29:盡量使函數(shù)的功能單一
- 建議30:避免把沒有關(guān)聯(lián)的語句放在一個(gè)函數(shù)中
- 建議31:函數(shù)的抽象級(jí)別應(yīng)該在同一層次
- 建議32:盡可能為簡單功能編寫函數(shù)
- 建議33:避免多段代碼重復(fù)做同一件事情
- 建議34:盡量避免編寫不可重入函數(shù)
- 建議34-1:避免在函數(shù)中使用static局部變量
- 建議34-2:避免函數(shù)返回指向靜態(tài)數(shù)據(jù)的指針
- 建議34-3:避免調(diào)用任何不可重入函數(shù)
- 建議34-4:對(duì)于全局變量,應(yīng)通過互斥信號(hào)量(即P、V操作)或者中斷機(jī)制等方法來保證函數(shù)的線程安全
- 建議34-5:理解可重入函數(shù)與線程安全函數(shù)之間的關(guān)系
- 建議35:盡量避免設(shè)計(jì)多參數(shù)函數(shù)
- 建議35-1:沒有參數(shù)的函數(shù)必須使用void填充
- 建議35-2:盡量避免在非調(diào)度函數(shù)中使用控制參數(shù)
- 建議35-3:避免將函數(shù)的參數(shù)作為工作變量
- 建議35-4:使用const防止指針類型的輸入?yún)?shù)在函數(shù)體內(nèi)被意外修改
- 建議36:沒有返回值的函數(shù)應(yīng)聲明為void類型
- 建議37:確保函數(shù)體的“入口”與“出口”安全性
- 建議37-1:盡量在函數(shù)體入口處對(duì)參數(shù)做有效性檢查
- 建議37-2:盡量在函數(shù)體出口處對(duì)return語句做安全性檢查
- 建議38:在調(diào)用函數(shù)時(shí),必須對(duì)返回值進(jìn)行判斷,同時(shí)對(duì)錯(cuò)誤的返回值還要有相應(yīng)的錯(cuò)誤處理
- 建議39:盡量減少函數(shù)本身或者函數(shù)間的遞歸調(diào)用
- 建議40:盡量使用inline內(nèi)聯(lián)函數(shù)來替代#define宏
- 第5章 不會(huì)使用指針的程序員是不合格的
- 建議41:理解指針變量的存儲(chǔ)實(shí)質(zhì)
- 建議42:指針變量必須初始化
- 建議43:區(qū)別“int*p=NULL”和“*p=NULL”
- 建議44:理解空(null)指針與NULL指針
- 建議44-1:區(qū)別空(null)指針與NULL指針的概念
- 建議44-2:用NULL指針終止對(duì)遞歸數(shù)據(jù)結(jié)構(gòu)的間接引用
- 建議44-3:用NULL指針作函數(shù)調(diào)用失敗時(shí)的返回值
- 建議44-4:用NULL指針作警戒值
- 建議44-5:避免對(duì)NULL指針進(jìn)行解引用
- 建議45:謹(jǐn)慎使用void指針
- 建議45-1:避免對(duì)void指針進(jìn)行算術(shù)操作
- 建議45-2:如果函數(shù)的參數(shù)可以是任意類型指針,應(yīng)該將其參數(shù)聲明為void*
- 建議46:避免使用指針的長度確定它所指向類型的長度
- 建議47:避免把指針轉(zhuǎn)換為對(duì)齊要求更嚴(yán)格的指針類型
- 建議48:避免將一種類型的操作符應(yīng)用于另一種不兼容的類型
- 建議49:謹(jǐn)慎指針與整數(shù)之間的轉(zhuǎn)換
- 建議50:區(qū)別“const int*p”與“int*const p”
- 建議51:深入理解函數(shù)參數(shù)的傳遞方式
- 建議51-1:理解函數(shù)參數(shù)的傳遞過程
- 建議51-2:掌握函數(shù)的參數(shù)傳遞方式
- 建議51-3:如果函數(shù)的參數(shù)是指針,避免用該指針去申請(qǐng)動(dòng)態(tài)內(nèi)存
- 建議51-4:盡量避免使用可變參數(shù)
- 第6章 數(shù)組并非指針
- 建議52:理解數(shù)組的存儲(chǔ)實(shí)質(zhì)
- 建議52-1:理解數(shù)組的存儲(chǔ)布局
- 建議52-2:理解&a[0]和&a的區(qū)別
- 建議52-3:理解數(shù)組名a作為右值和左值的區(qū)別
- 建議53:避免數(shù)組越界
- 建議53-1:盡量顯式地指定數(shù)組的邊界
- 建議53-2:對(duì)數(shù)組做越界檢查,確保索引值位于合法的范圍之內(nèi)
- 建議53-3:獲取數(shù)組的長度時(shí)不要對(duì)指針應(yīng)用sizeof操作符
- 建議54:數(shù)組并非指針
- 建議55:理解數(shù)組與指針的可交換性
- 建議56:禁止將一個(gè)指向非數(shù)組對(duì)象的指針加上或減去一個(gè)整數(shù)
- 建議57:禁止對(duì)兩個(gè)并不指向同一個(gè)數(shù)組的指針進(jìn)行相減或比較
- 建議58:若結(jié)果值并不引用合法的數(shù)組元素,不要將指針加上或減去一個(gè)整數(shù)
- 建議59:細(xì)說緩沖區(qū)溢出
- 建議60:區(qū)別指針數(shù)組和數(shù)組指針
- 建議61:深入理解數(shù)組參數(shù)
- 第7章 結(jié)構(gòu)、位域和枚舉
- 建議62:結(jié)構(gòu)體的設(shè)計(jì)要遵循簡單、單一原則
- 建議62-1:盡量使結(jié)構(gòu)體的功能單一
- 建議62-2:盡量減小結(jié)構(gòu)體間關(guān)系的復(fù)雜度
- 建議62-3:盡量使結(jié)構(gòu)體中元素的個(gè)數(shù)適中
- 建議62-4:合理劃分與改進(jìn)結(jié)構(gòu)體以提高空間效率
- 建議63:合理利用結(jié)構(gòu)體內(nèi)存對(duì)齊原理來提高程序效率
- 建議64:結(jié)構(gòu)體的長度不一定等于各個(gè)成員的長度之和
- 建議65:避免在結(jié)構(gòu)體之間執(zhí)行逐字節(jié)比較
- 建議66:謹(jǐn)慎使用位域
- 建議67:謹(jǐn)慎使用枚舉
- 建議68:禁止在位域成員上調(diào)用offsetof宏
- 建議69:深入理解結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針
- 第8章 字符與字符串
- 建議70:不要忽視字符串的null('\0')結(jié)尾符
- 建議70-1:正確認(rèn)識(shí)字符數(shù)組和字符串
- 建議70-2:字符數(shù)組必須能夠同時(shí)容納字符數(shù)據(jù)和null結(jié)尾符
- 建議70-3:謹(jǐn)慎字符數(shù)組的初始化
- 建議71:盡量使用const指針來引用字符串常量
- 建議72:區(qū)別strlen函數(shù)與sizeof運(yùn)算符
- 建議73:在使用不受限制的字符串函數(shù)時(shí),必須保證結(jié)果字符串不會(huì)溢出內(nèi)存
- 建議73-1:避免字符串拷貝發(fā)生溢出
- 建議73-2:區(qū)別串拷貝strcpy與內(nèi)存拷貝memcpy
- 建議73-3:避免strcpy與memcpy函數(shù)內(nèi)存重疊
- 建議73-4:區(qū)別字符串比較與內(nèi)存比較
- 建議73-5:避免strcat函數(shù)發(fā)生內(nèi)存重疊與溢出
- 建議74:謹(jǐn)慎strtok函數(shù)的不可重入性
- 建議75:掌握字符串查找技術(shù)
- 建議75-1:使用strchr與strrchr函數(shù)查找單個(gè)字符
- 建議75-2:使用strpbrk函數(shù)查找多個(gè)字符
- 建議75-3:使用strstr函數(shù)查找一個(gè)子串
- 建議75-4:區(qū)別strspn與strcspn函數(shù)
- 第9章 文件系統(tǒng)
- 建議76:謹(jǐn)慎使用printf和scanf函數(shù)
- 建議77:謹(jǐn)慎文件打開操作
- 建議77-1:正確指定fopen的mode參數(shù)
- 建議77-2:必須檢查fopen函數(shù)的返回值
- 建議77-3:盡量避免重復(fù)打開已經(jīng)被打開的文件
- 建議77-4:區(qū)別fopen與fopen_s函數(shù)
- 建議77-5:區(qū)別fopen與freopen函數(shù)
- 建議78:文件操作完成后必須關(guān)閉
- 建議79:正確理解EOF宏
- 建議80:盡量使用feof和ferror檢測文件結(jié)束和錯(cuò)誤
- 建議81:盡量使用fgets替換gets函數(shù)
- 建議82:盡量使用fputs替換puts函數(shù)
- 建議83:合理選擇單個(gè)字符讀寫函數(shù)
- 建議84:區(qū)別格式化讀寫函數(shù)
- 建議84-1:區(qū)別printf/scanf、fprintf/fscanf和sprintf/sscanf
- 建議84-2:盡量使用snprintf替代sprintf函數(shù)
- 建議84-3:區(qū)別vprintf/vscanf、vfprintf/vfscanf、vsprintf/vsscanf和vsnprintf
- 建議85:盡量使用fread與fwrite函數(shù)來讀寫二進(jìn)制文件
- 建議86:盡量使用fseek替換rewind函數(shù)
- 建議87:盡量使用setvbuf替換setbuf函數(shù)
- 建議88:謹(jǐn)慎remove函數(shù)刪除已打開的文件
- 建議89:謹(jǐn)慎rename函數(shù)重命名已經(jīng)存在的文件
- 第10章 預(yù)處理器
- 建議90:謹(jǐn)慎宏定義
- 建議90-1:在使用宏定義表達(dá)式時(shí)必須使用完備的括號(hào)
- 建議90-2:盡量消除宏的副作用
- 建議90-3:避免使用宏創(chuàng)建一種“新語言”
- 建議91:合理地選擇函數(shù)與宏
- 建議92:盡量使用內(nèi)聯(lián)函數(shù)代替宏
- 建議93:掌握預(yù)定義宏
- 建議94:謹(jǐn)慎使用“#include”
- 建議94-1:區(qū)別“#include<filename.h>”與“#include"filename.h"”
- 建議94-2:必須保證頭文件名稱的唯一性
- 建議95:掌握條件編譯指令
- 建議95-1:使用“#ifndef/#define/#endif”防止頭文件被重復(fù)引用
- 建議95-2:使用條件編譯指令實(shí)現(xiàn)源代碼的部分編譯
- 建議95-3:妙用“defined”
- 建議96:盡量避免在一個(gè)函數(shù)塊中單獨(dú)使用“#define”或“#undef”
- 第11章 斷言與異常處理
- 建議97:謹(jǐn)慎使用斷言
- 建議97-1:盡量利用斷言來提高代碼的可測試性
- 建議97-2:盡量在函數(shù)中使用斷言來檢查參數(shù)的合法性
- 建議97-3:避免在斷言表達(dá)式中使用改變環(huán)境的語句
- 建議97-4:避免使用斷言去檢查程序錯(cuò)誤
- 建議97-5:盡量在防錯(cuò)性程序設(shè)計(jì)中使用斷言來進(jìn)行錯(cuò)誤報(bào)警
- 建議97-6:用斷言保證沒有定義的特性或功能不被使用
- 建議97-7:謹(jǐn)慎使用斷言對(duì)程序開發(fā)環(huán)境中的假設(shè)進(jìn)行檢查
- 建議98:謹(jǐn)慎使用errno
- 建議98-1:調(diào)用errno之前必須先將其清零
- 建議98-2:避免重定義errno
- 建議98-3:避免使用errno檢查文件流錯(cuò)誤
- 建議99:謹(jǐn)慎使用函數(shù)的返回值來標(biāo)志函數(shù)是否執(zhí)行成功
- 建議100:盡量避免使用goto進(jìn)行出錯(cuò)跳轉(zhuǎn)
- 建議101:盡量避免使用setjmp與longjmp組合
- 第12章 內(nèi)存管理
- 建議102:淺談程序的內(nèi)存結(jié)構(gòu)
- 建議103:淺談堆和棧
- 建議104:避免錯(cuò)誤分配內(nèi)存
- 建議104-1:對(duì)內(nèi)存分配函數(shù)的返回值必須進(jìn)行檢查
- 建議104-2:內(nèi)存資源的分配與釋放應(yīng)該限定在同一模塊或者同一抽象層內(nèi)進(jìn)行
- 建議104-3:必須對(duì)內(nèi)存分配函數(shù)的返回指針進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- 建議104-4:確保指針指向一塊合法的內(nèi)存
- 建議104-5:確保為對(duì)象分配足夠的內(nèi)存空間
- 建議104-6:禁止執(zhí)行零長度的內(nèi)存分配
- 建議104-7:避免大型的堆棧分配
- 建議104-8:避免內(nèi)存分配成功,但并未初始化
- 建議105:確保安全釋放內(nèi)存
- 建議105-1:malloc等內(nèi)存分配函數(shù)與free必須配對(duì)使用
- 建議105-2:在free之后必須為指針賦一個(gè)新值
- 建議106:避免內(nèi)存越界
- 建議106-1:避免數(shù)組越界
- 建議106-2:避免sprintf、vsprintf、strcpy、strcat與gets越界
- 建議106-3:避免memcpy與memset函數(shù)長度越界
- 建議106-4:避免忽略字符串最后的'\0'字符而導(dǎo)致的越界
- 建議107:避免內(nèi)存泄漏
- 建議108:避免calloc參數(shù)相乘的值超過size_t表示的范圍
- 第13章 信號(hào)處理
- 建議109:理解信號(hào)
- 建議110:盡量使用sigaction替代signal
- 建議111:避免在信號(hào)處理函數(shù)內(nèi)部訪問或修改共享對(duì)象
- 建議112:避免以遞歸方式調(diào)用raise函數(shù)
- 第14章 了解C11標(biāo)準(zhǔn)
- 建議113:謹(jǐn)慎使用_Generic
- 建議114:盡量使用gets_s替換gets函數(shù)
- 建議115:盡量使用帶邊界檢查的字符串操作函數(shù)
- 建議116:了解C11多線程編程
- 建議117:使用靜態(tài)斷言_Static_assert執(zhí)行編譯時(shí)檢查
- 建議118:使用_Noreturn標(biāo)識(shí)不返回值的函數(shù)
- 第15章 保持良好的設(shè)計(jì)
- 建議119:避免錯(cuò)誤地變量初始化
- 建議120:謹(jǐn)慎使用內(nèi)聯(lián)函數(shù)
- 建議121:避免在函數(shù)內(nèi)定義占用內(nèi)存很大的局部變量
- 建議122:謹(jǐn)慎設(shè)計(jì)函數(shù)參數(shù)的順序和個(gè)數(shù)
- 建議123:謹(jǐn)慎使用標(biāo)準(zhǔn)函數(shù)庫
- 建議124:避免不必要的函數(shù)調(diào)用
- 建議125:謹(jǐn)慎程序中嵌入?yún)R編代碼 更新時(shí)間:2019-01-01 01:34:07