C語言學習筆記:C語言代碼優化的一些技巧(二)

函數相關

1、參數的書寫要完整

參數的書寫要完整,不要貪圖省事只寫參數的類型而省略參數名字。如果函數沒有參數,則用void填充。例如:

voidSetValue(intwidth,intheight); // 良好的風格
voidSetValue(int,int);            // 不良的風格
floatGetValue(void); // 良好的風格
floatGetValue();     // 不良的風格

2、參數命名要恰當,順序要合理

例如編寫字符串拷貝函數StringCopy,它有兩個參數。如果把參數名字起爲str1和str2,例如:

void StringCopy(char*str1,char*str2);

那麼我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來。

可以把參數名字起得更有意義,如叫strSourcestrDestination。這樣從名字上就可以看出應該把strSource拷貝到strDestination。

還有一個問題,這兩個參數那一個該在前那一個該在後?參數的順序要遵循程序員的習慣。一般地,應將目的參數放在前面,源參數放在後面:

void StringCopy(char*strDestination,char*strSource);

3、參數是指針

如果參數是指針,且僅作輸入用,則應在類型前加const,以防止該指針在函數體內被意外修改。

例如:

void StringCopy(char*strDestination,constchar*strSource);

這裏推薦一下我建的C/C++語言學習交流秋秋裙,前三位是:110,中間三位是:355,最後三位是:025,裏面有學習不錯視頻教程、開發工具、電子書籍,完整的項目源碼等,專業的老師解答問題!

 

4、不要省略返回值的類型

C語言中,凡不加類型說明的函數,一律自動按整型處理。這樣做不會有什麼好處,卻容易被誤解爲void類型。

5、函數名字與返回值類型在語義上不可衝突

違反這條規則的典型代表是C標準庫函數getchar。例如:

charc;
c=getchar();
if(c==EOF)
…

按照getchar名字的意思,將變量c聲明爲char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:

int getchar(void);

由於c是char類型,取值範圍是[-128,127],如果宏EOF的值在char的取值範圍之外,那麼if語句將總是失敗,這種“危險”人們一般哪裏料得到!導致本例錯誤的責任並不在用戶,是函數getchar誤導了使用者。

6、不要將正常值和錯誤標誌混在一起返回

正常值用輸出參數獲得,而錯誤標誌用return語句返回。

回顧上例,C標準庫函數的設計者爲什麼要將getchar聲明爲令人迷糊的int類型呢?

在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結束標誌或發生讀錯誤,它必須返回一個標誌EOF。爲了區別於正常的字符,只好將EOF定義爲負數(通常爲負1)。因此函數getchar就成了int類型。

我們在實際工作中,經常會碰到上述令人爲難的問題。爲了避免出現誤解,我們應該將正常值和錯誤標誌分開。即:正常值用輸出參數獲得,而錯誤標誌用return語句返回。

函數getchar可以改寫成BOOL GetChar(char*c);

7、附加返回值,增強函數的靈活性

有時候函數原本不需要返回值,但爲了增加靈活性如支持鏈式表達,可以附加返回值。例如字符串拷貝函數strcpy的原型:

char *strcpy(char *strDest,const char *strSrc);

strcpy函數將strSrc拷貝至輸出參數strDest中,同時函數的返回值又是strDest。這樣做並非多此一舉,可以獲得如下靈活性:

char str[20];
int length=strlen(strcpy(str,“HelloWorld”));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章