C C 編碼技巧

2021-08-22 17:05:17 字數 1912 閱讀 8168

宣告:其中有些內容並不是本人原創,而是學習的別人的經驗,或者是從書上看到的總結在此,既然拿出來共享,本人不再區分本人原創部分,而且有些技巧已經是眾所周知,或者已經用了很長時間了,也弄不清出處了,這些對原創者一併給予感謝!

1. char str[20]

char* cp = &(str[2]);

這樣比使用

char* cp = str+2;

要好,因為後編譯器容易編譯成加法指令,而上面這種方法編譯器很容易優化,把str[2]解釋為常量傳給cp

2.短路徑優先返回原則:如 if/else塊包含return語句時,把包含return的塊放在前面,去掉else, 如:

if(i>3)

else

改為if( i<=3)

// process block

這樣可以減小的巢狀深度,使**更容易閱讀。如果if和else塊中都有程式塊進行正常的處理,沒有返回語句,要把較小的塊放到前面,使**沒有頭重腳輕的感覺。如果if/else語句中包含錯誤處理塊,把錯誤處理塊放到前面,以強調事務處理中的特殊情況,如果這樣會使條件判斷的複雜度提公升,則可以不採用本規則。

3. 多行巨集定義。使用do/while定義包含多行程式的巨集如

#define increase_var(var) dowhile(0)

4. 長表示式換行。當表示式太長或參數列太長需要換行時將運算子放到下行行首,而不是上一行尾。如

if( the_first_value

|| the_second_value

) 而不是

if(the_first_value ||

the_second_value)

function(argument_1

, argument_2

, argument_3

) 而不是

function(argument_1,

argument_2,

argument_3)

第一種格式中,如果想要注釋掉條件表示式的一部分或者函式引數的某個引數時,只需要將某一行注釋舊即可,非常方便。

5. 在==表示式中,將常量放到左端,例如:

int i=2;

if( 3 == i)

這樣就能夠避免由於少輸入乙個等號「=」,造成程式錯誤,因為如果把 3==i 錯寫成 3=i 編譯器會直接報錯。

6.在不需要返回值的函式呼叫前加(void)以表示該函式不返回任何值,以提高可讀性,如:

void myfunc(int arg)

void main(void)

7.在幫助中使用argv[0]輸出命令名稱,不要使用硬編碼。如:不要使用

printf("usage: commandname -u -v");

而要使用

printf("usage: %s -u -v", argv[0]);

這樣即使使用者將程式改名,或者以後改名,幫助仍然會輸出正確的命令,而無而修改程式。

8.注釋技巧。如:

//* block beginning

... block here

// block end */

這裡的block是參加編譯的**,如果在除錯的時候想把該塊注釋掉,只需要刪除第一行前面的乙個"/",因為上面的程式**中編譯器先解析第一行,發現有兩個"/",則該行都被視為注釋,不再解析後面的*,最後一行同理,所以首尾兩行都被解析為行注釋,而**可以被編譯。如果去掉最前面的乙個"/",編譯器解析時先解析到/* ,所以會認為是塊注釋,便等待乙個 */ ,其中的部分都被視為注釋,即直到最後一行的*/都被視為注釋,所以程式塊不會被編譯。這在除錯程式時比較有用,切換比較快。其實,現在soureinsignt, keil c51, visual studio, borland c++等編譯器都支援選擇一塊程式,使用選單命令自動新增//,這個技巧好像不是太有用,但對於其它編輯器可能還是有用的。6

C C 除錯技巧

本文源於thinking in c chapter 3 和平時寫程式所得,會持續更新 書中3.9除錯技巧 p106 c的assert 巨集 方便的除錯巨集,引數為乙個斷言為真的表示式,如果斷言不為真,則發出乙個錯誤資訊告訴斷言是什麼並且程式終止。include include using names...

編碼小技巧

1.define abc dowhile 0 define abc do 在核心中經常見到第一種用法,第一種用法和第二種用法的區別在 呢?看下面的例子 例一 if a abc else 例二 abc 例一中如果我們將巨集寫成第二種形式,編譯時會得到乙個編譯錯誤。例二中如果我們寫成第二種形式,在編譯時...

編碼小技巧

a codementor print reverse is a 1 翻轉後的結果為 rotnemedoc mat 1,2,3 4,5,6 zip mat 1,4 2,5 3,6 a 1,2,3 將列表中的三個元素分拆成三個變數 a 1,2,3 x,y,z a x1 y2 z3a code mento...