縮排格式
Tab是8個字元,於是縮排也是8個字元.有很多怪異的風格,他們將縮排格式定義為4個字元(設定為2個字元!)的深度,這就象試圖將PI定義為3一樣讓人難以接受.
理由是:縮排的大小是為了清楚的定義一個塊的開始和結束.特別是當你已經在電腦前面呆了20多個小時了以後,你會發現一個大的縮排格式使得你對程式的理解更容易.
現在,有一些人說,使用8個字元的縮排使得代碼離右邊很近,在80個字元寬度的終端螢幕上看程式很難受.回答是,但你的程式有3個以上的縮排的時候,你就應該修改你的程式.
總之,8個字元的縮排使得程式易讀,還有一個附加的好處,就是它能在你將程式變得嵌套層數太多的時候給你警告.這個時候,你應該修改你的程式.
大符號的位置
另外一個C程式編程風格的問題是對大括弧的處理.同縮排大小不同,幾乎沒有什麼理由去選擇一種而不選擇另外一種風格,但有一種推薦的風格,它是Kernighan和Ritchie的經典的那本書帶來的,它將開始的大括弧放在一行的最後,而將結束大括弧放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,還有一種特殊的情況:命名函數:開始的括弧是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正統的人會非難這種不一致性,但是,所有思維正常的人明白: (第一) K&R是___對___的,(第二)如果K&R不對,請參見第一條. (:-))......另外,函數也是特殊的,不一定非得一致.
需要注意的是結束的括弧在它所佔的那一行是空的,__除了__它跟隨著同一條語句的繼續符號.如"while"在do-while迴圈中,或者"else"在if語句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.
另外,注意到這種大括弧的放置方法減小了空行的數量,但卻沒有減少可讀性.於是,在螢幕大小受到限制的時候,你就可以有更多的空行來寫些注釋了.
命名系統
C是一種簡潔的語言,那麼,命名也應該是簡潔的.同MODULE-2以及ASCAL語言不同的是,C程式員不使用諸如ThisVariableIsATemporaryCounter之類的命名方式.一個C語言的程式員會將之命名為"tmp",這很容易書寫,且並不是那麼難以去理解.
然而,當混合類型的名字不得不出現的時候,描述性名字對全域變數來說是必要的了.調用一個名為"foo"全域的函數是很讓人惱火的.全域變數(只有你必須使用的時候才使用它) ,就象全域函數一樣,需要描述性的命名方式.假如你有一個函數用來計算活動使用者的數量,你應該這樣命名--"count_active_users()"--或另外的相近的形式,你不應命名為"cntusr()".
有一種稱為Hungarian命名方式,它將函數的類型編碼寫入變數名中,這種方式是腦子有毛病的一種表現---編譯器知道這個類型而且會去檢查它,而這樣只會迷惑程式員. --知道為什麼Micro$oft為什麼會生產這麼多"臭蟲"程式了把!!.
局部變數的命名應該短小精悍.假如你有一個隨機的整數迴圈計數器,它有可能有"i",如果沒有任何可能使得它能被誤解的話,將其寫作"loop_counter"是效率低下的.同樣的,""tmp"可以是任何臨時數值的函數變數.
如果你害怕混淆你的局部變數的名字,還有另外一個問題,就是稱function-growth-hormone-imbalancesyndrome.