8. 簡單語句

每行只應(yīng)該有一條語句城丧,除非多條語句關(guān)聯(lián)特別緊密。

case FOO:  oogle (zork);  boogle (zork);  break;
case BAR:  oogle (bork);  boogle (zork);  break;
case BAZ:  oogle (gork);  boogle (bork);  break;

for或while循環(huán)語句的空體應(yīng)該單獨(dú)放在一行并加上注釋,這樣可以清晰的看出空體是有意而為概作,并非遺漏代碼。

while (*dest++ = *src++)
    ;    /* VOID */

不要對(duì)非零表達(dá)式進(jìn)行默認(rèn)測試默怨,例如:

if (f() != FAIL)

比下面的代碼更好

if (f())

即使FAIL的值可能為0(在C中0被認(rèn)為是假)讯榕。當(dāng)后續(xù)有人決定使用-1替代0作為失敗返回值時(shí),一個(gè)顯式的測試將解決你的問題匙睹。即使比較的值永遠(yuǎn)不會(huì)改變愚屁,我們也應(yīng)該使用顯式的比較;例如

if (!(bufsize % sizeof(int)))

應(yīng)該被寫成

if ((bufsize % sizeof(int)) == 0)

這樣可以反映這個(gè)測試的數(shù)值(非布爾)本質(zhì)痕檬。一個(gè)常見的錯(cuò)誤點(diǎn)是使用strcmp測試字符串是否相同霎槐,這個(gè)測試的結(jié)果永遠(yuǎn)不應(yīng)該被放棄。比較好的方法是定義一個(gè)宏STREQ梦谜。

#define STREQ(a, b) (strcmp((a), (b)) == 0)

對(duì)謂詞或滿足下面約束的表達(dá)式丘跌,非零測試經(jīng)常被放棄:

0表示假,其他都為真唁桩。
通過其命名可以看出返回真是顯而易見的闭树。 

用isvalid或valid稱呼一個(gè)謂詞,不要用checkvalid荒澡。

一個(gè)非常常見的實(shí)踐就是在一個(gè)全局頭文件中聲明一個(gè)布爾類型"bool"报辱。這個(gè)特殊的名字可以極大地提高代碼可讀性。

typedef int    bool;
#define FALSE    0
#define TRUE    1

typedef enum { NO=0, YES } bool;

即便有了這些聲明单山,也不要檢查一個(gè)布爾值與1(TRUE碍现,YES等)的相當(dāng)性;可用測試與0(FALSE米奸,NO等)的不等性替代昼接。絕大多數(shù)函數(shù)都可以保證為假的時(shí)候返回0,但為真的時(shí)候只返回非零悴晰。

if (func() == TRUE) { ...

必須被寫成

if (func() != FALSE) { ...

如果可能的話辩棒,最好為函數(shù)/變量重命名或者重寫這個(gè)表達(dá)式,這樣就可以顯而易見的知道其含義,而無需再與true或false比較了(例如一睁,重命名為isvalid())钻弄。

嵌入賦值語句也有用武之地。在一些結(jié)構(gòu)中者吁,在沒有降低代碼可讀性的前提下窘俺,沒有比這更好的方式來實(shí)現(xiàn)這個(gè)結(jié)果了。

while ((c = getchar()) != EOF) {
    process the character
}

++和--操作符可算作是賦值語句复凳。這樣瘤泪,為了某些意圖,實(shí)現(xiàn)帶有副作用的功能育八。使用嵌入賦值語句也可能提高運(yùn)行時(shí)的性能对途。不過,大家應(yīng)該在提高的性能與下降的可維護(hù)性之間做好權(quán)衡髓棋。當(dāng)在一些人為的地方使用嵌入賦值語句時(shí)实檀,這種情況會(huì)發(fā)生,例如:

a = b + c;
d = a + r;

不應(yīng)該被下面代碼替代:

d = (a = b + c) + r;

即使后者可能節(jié)省一個(gè)計(jì)算周期按声。在長期運(yùn)行時(shí)膳犹,由于優(yōu)化器漸獲成熟,兩者的運(yùn)行時(shí)間差距將下降签则,而兩者在維護(hù)性方面的差異將提高须床,因?yàn)槿祟惖挠洃洉?huì)隨著時(shí)間的流逝而衰退。

在任何結(jié)構(gòu)良好的代碼中渐裂,goto語句都應(yīng)該保守地使用豺旬。使用goto帶來好處最大的地方是從switch、for和while多層嵌套中跳出柒凉,但這樣做的需求也暗示了代碼的內(nèi)層結(jié)構(gòu)應(yīng)該被抽取出來放到一個(gè)單獨(dú)的返回值為成功或失敗的函數(shù)中哈垢。

    for (...) {
        while (...) {
            ...
            if (disaster)
                goto error;
       
        }
    }
    ...
error:
    clean up the mess

當(dāng)需要goto時(shí)候,其對(duì)應(yīng)的標(biāo)簽應(yīng)該被放在單獨(dú)一行扛拨,并且后續(xù)的代碼縮進(jìn)一級(jí)。使用goto語句時(shí)應(yīng)該增加注釋(可能放在代碼塊的頭)以說明它的功用和目的举塔。continue應(yīng)該保守地使用绑警,并且盡可能靠近循環(huán)的頂部。Break的麻煩比較少央渣。

非原型函數(shù)的參數(shù)有時(shí)需要被顯式做類型提升计盒。例如,如果函數(shù)期望一個(gè)32bit的長整型芽丹,但卻被傳入一個(gè)16bit的整型數(shù)北启,可能會(huì)導(dǎo)致函數(shù)棧不對(duì)齊。指針,整型和浮點(diǎn)值都會(huì)發(fā)生此問題咕村。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场钉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子懈涛,更是在濱河造成了極大的恐慌逛万,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批钠,死亡現(xiàn)場離奇詭異宇植,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)埋心,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門指郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拷呆,你說我怎么就攤上這事闲坎。” “怎么了洋腮?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵箫柳,是天一觀的道長。 經(jīng)常有香客問我啥供,道長悯恍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任伙狐,我火速辦了婚禮涮毫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贷屎。我一直安慰自己罢防,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布唉侄。 她就那樣靜靜地躺著咒吐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪属划。 梳的紋絲不亂的頭發(fā)上恬叹,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音同眯,去河邊找鬼绽昼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛须蜗,可吹牛的內(nèi)容都是我干的硅确。 我是一名探鬼主播目溉,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菱农!你這毒婦竟也來了缭付?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤大莫,失蹤者是張志新(化名)和其女友劉穎蛉腌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只厘,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙丛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羔味。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片河咽。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赋元,靈堂內(nèi)的尸體忽然破棺而出忘蟹,到底是詐尸還是另有隱情,我是刑警寧澤搁凸,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布媚值,位于F島的核電站,受9級(jí)特大地震影響护糖,放射性物質(zhì)發(fā)生泄漏褥芒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一嫡良、第九天 我趴在偏房一處隱蔽的房頂上張望锰扶。 院中可真熱鬧,春花似錦寝受、人聲如沸坷牛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽京闰。三九已至,卻和暖如春甩苛,著一層夾襖步出監(jiān)牢的瞬間蹂楣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工浪藻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乾翔。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓爱葵,卻偏偏與公主長得像施戴,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萌丈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容