縮進(jìn)格式
Tab是8個(gè)字符,于是縮進(jìn)也是8個(gè)字符.有很多怪異的風(fēng)格,他們將縮進(jìn)格式定義為4個(gè)字符(設(shè)置為2個(gè)字符!)的深度,這就象試圖將PI定義為3一樣讓人難以接受.
理由是:縮進(jìn)的大小是為了清楚的定義一個(gè)塊的開(kāi)始和結(jié)束.特別是當(dāng)你已經(jīng)在計(jì)算機(jī)前面呆了20多個(gè)小時(shí)了以后,你會(huì)發(fā)現(xiàn)一個(gè)大的縮進(jìn)格式使得你對(duì)程序的理解更容易.
現(xiàn)在,有一些人說(shuō),使用8個(gè)字符的縮進(jìn)使得代碼離右邊很近,在80個(gè)字符寬度的終端屏幕上看程序很難受.回答是,但你的程序有3個(gè)以上的縮進(jìn)的時(shí)候,你就應(yīng)該修改你的程序.
總之,8個(gè)字符的縮進(jìn)使得程序易讀,還有一個(gè)附加的好處,就是它能在你將程序變得嵌套層數(shù)太多的時(shí)候給你警告.這個(gè)時(shí)候,你應(yīng)該修改你的程序.
大符號(hào)的位置
另外一個(gè)C程序編程風(fēng)格的問(wèn)題是對(duì)大括號(hào)的處理.同縮進(jìn)大小不同,幾乎沒(méi)有什么理由去選擇一種而不選擇另外一種風(fēng)格,但有一種推薦的風(fēng)格,它是Kernighan和Ritchie的經(jīng)典的那本書(shū)帶來(lái)的,它將開(kāi)始的大括號(hào)放在一行的最后,而將結(jié)束大括號(hào)放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,還有一種特殊的情況:命名函數(shù):開(kāi)始的括號(hào)是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正統(tǒng)的人會(huì)非難這種不一致性,但是,所有思維正常的人明白: (第一) K&R是___對(duì)___的,(第二)如果K&R不對(duì),請(qǐng)參見(jiàn)第一條. (:-))......另外,函數(shù)也是特殊的,不一定非得一致.
需要注意的是結(jié)束的括號(hào)在它所占的那一行是空的,__除了__它跟隨著同一條語(yǔ)句的繼續(xù)符號(hào).如"while"在do-while循環(huán)中,或者"else"在if語(yǔ)句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.
另外,注意到這種大括號(hào)的放置方法減小了空行的數(shù)量,但卻沒(méi)有減少可讀性.于是,在屏幕大小受到限制的時(shí)候,你就可以有更多的空行來(lái)寫(xiě)些注釋了.
命名系統(tǒng)
C是一種簡(jiǎn)潔的語(yǔ)言,那么,命名也應(yīng)該是簡(jiǎn)潔的.同MODULE-2以及ASCAL語(yǔ)言不同的是,C程序員不使用諸如ThisVariableIsATemporaryCounter之類的命名方式.一個(gè)C語(yǔ)言的程序員會(huì)將之命名為"tmp",這很容易書(shū)寫(xiě),且并不是那么難以去理解.
然而,當(dāng)混合類型的名字不得不出現(xiàn)的時(shí)候,描述性名字對(duì)全局變量來(lái)說(shuō)是必要的了.調(diào)用一個(gè)名為"foo"全局的函數(shù)是很讓人惱火的.全局變量(只有你必須使用的時(shí)候才使用它) ,就象全局函數(shù)一樣,需要描述性的命名方式.假如你有一個(gè)函數(shù)用來(lái)計(jì)算活動(dòng)用戶的數(shù)量,你應(yīng)該這樣命名--"count_active_users()"--或另外的相近的形式,你不應(yīng)命名為"cntusr()".
有一種稱為Hungarian命名方式,它將函數(shù)的類型編碼寫(xiě)入變量名中,這種方式是腦子有毛病的一種表現(xiàn)---編譯器知道這個(gè)類型而且會(huì)去檢查它,而這樣只會(huì)迷惑程序員. --知道為什么Micro$oft為什么會(huì)生產(chǎn)這么多"臭蟲(chóng)"程序了把!!.
Tab是8個(gè)字符,于是縮進(jìn)也是8個(gè)字符.有很多怪異的風(fēng)格,他們將縮進(jìn)格式定義為4個(gè)字符(設(shè)置為2個(gè)字符!)的深度,這就象試圖將PI定義為3一樣讓人難以接受.
理由是:縮進(jìn)的大小是為了清楚的定義一個(gè)塊的開(kāi)始和結(jié)束.特別是當(dāng)你已經(jīng)在計(jì)算機(jī)前面呆了20多個(gè)小時(shí)了以后,你會(huì)發(fā)現(xiàn)一個(gè)大的縮進(jìn)格式使得你對(duì)程序的理解更容易.
現(xiàn)在,有一些人說(shuō),使用8個(gè)字符的縮進(jìn)使得代碼離右邊很近,在80個(gè)字符寬度的終端屏幕上看程序很難受.回答是,但你的程序有3個(gè)以上的縮進(jìn)的時(shí)候,你就應(yīng)該修改你的程序.
總之,8個(gè)字符的縮進(jìn)使得程序易讀,還有一個(gè)附加的好處,就是它能在你將程序變得嵌套層數(shù)太多的時(shí)候給你警告.這個(gè)時(shí)候,你應(yīng)該修改你的程序.
大符號(hào)的位置
另外一個(gè)C程序編程風(fēng)格的問(wèn)題是對(duì)大括號(hào)的處理.同縮進(jìn)大小不同,幾乎沒(méi)有什么理由去選擇一種而不選擇另外一種風(fēng)格,但有一種推薦的風(fēng)格,它是Kernighan和Ritchie的經(jīng)典的那本書(shū)帶來(lái)的,它將開(kāi)始的大括號(hào)放在一行的最后,而將結(jié)束大括號(hào)放在一行的第一位,如下所示:
if (x is true) { we do y }
然而,還有一種特殊的情況:命名函數(shù):開(kāi)始的括號(hào)是放在下一行的第一位,如下:
int function(int x) { body of function }
所有非正統(tǒng)的人會(huì)非難這種不一致性,但是,所有思維正常的人明白: (第一) K&R是___對(duì)___的,(第二)如果K&R不對(duì),請(qǐng)參見(jiàn)第一條. (:-))......另外,函數(shù)也是特殊的,不一定非得一致.
需要注意的是結(jié)束的括號(hào)在它所占的那一行是空的,__除了__它跟隨著同一條語(yǔ)句的繼續(xù)符號(hào).如"while"在do-while循環(huán)中,或者"else"在if語(yǔ)句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.
另外,注意到這種大括號(hào)的放置方法減小了空行的數(shù)量,但卻沒(méi)有減少可讀性.于是,在屏幕大小受到限制的時(shí)候,你就可以有更多的空行來(lái)寫(xiě)些注釋了.
命名系統(tǒng)
C是一種簡(jiǎn)潔的語(yǔ)言,那么,命名也應(yīng)該是簡(jiǎn)潔的.同MODULE-2以及ASCAL語(yǔ)言不同的是,C程序員不使用諸如ThisVariableIsATemporaryCounter之類的命名方式.一個(gè)C語(yǔ)言的程序員會(huì)將之命名為"tmp",這很容易書(shū)寫(xiě),且并不是那么難以去理解.
然而,當(dāng)混合類型的名字不得不出現(xiàn)的時(shí)候,描述性名字對(duì)全局變量來(lái)說(shuō)是必要的了.調(diào)用一個(gè)名為"foo"全局的函數(shù)是很讓人惱火的.全局變量(只有你必須使用的時(shí)候才使用它) ,就象全局函數(shù)一樣,需要描述性的命名方式.假如你有一個(gè)函數(shù)用來(lái)計(jì)算活動(dòng)用戶的數(shù)量,你應(yīng)該這樣命名--"count_active_users()"--或另外的相近的形式,你不應(yīng)命名為"cntusr()".
有一種稱為Hungarian命名方式,它將函數(shù)的類型編碼寫(xiě)入變量名中,這種方式是腦子有毛病的一種表現(xiàn)---編譯器知道這個(gè)類型而且會(huì)去檢查它,而這樣只會(huì)迷惑程序員. --知道為什么Micro$oft為什么會(huì)生產(chǎn)這么多"臭蟲(chóng)"程序了把!!.