良好的編程風格
匈牙利命名法為C程式標識符的命名定義了一種非常標準化的方式,這種命名方式是以兩條規則為基礎的:
a. 變數的名字以一個或者多個小寫字母首碼開頭,首碼能夠體現VARIANT 資料型別、範圍等資訊。
b. 在標識符內,首碼以後就是一個或者多個第一個字母大寫的單詞,這些單詞清楚地指出了該標識符的作用
1)變數命名加首碼
c char
s short
n int nDoorNum
l long
b boolean取值只為真和假的整型變數 如 bValid
f float 浮點數
d double
a 數組 a[5]
2)變數名中單詞開頭字母大寫,其他字母小寫
但是常用的意義明顯的變數,如 i,j,k, 座標 x,y等不必遵循 1),2) StudentName, TeacherName
3)常量和宏都是大寫,單詞之間用 ‘_’分隔
#define MAX_WIDTH 5
#define PI 3.14
#define ABS(x) ((x)>=0?(x):-(x))
標識符號應能提供足夠資訊,最好是可以發音的。
為全域變數取長的,描述資訊多的名字,為局部變數取短名字
名字太長時可以適當採用單詞的縮寫。但要注意,縮寫方式要一致。要縮寫就全都縮寫。
比如 單詞Number, 如果在某個變數裡縮寫成了:
int nDoorNum;那麼最好包含 Number單詞的變數都縮寫成 Num。
4)注意使用單詞的複數形式。如
int nTotalStudents, nStudents ;容易讓人理解成代表學生數目,而 nStudent 含義就不十分明顯
5) 對於傳回值為真或假的函數,加“Is”首碼如:
int IsCanceled();
int isalpha(); // C語言標準庫函數
BOOL IsButtonPushed();
6) 對於擷取某個數值的函數,加 “Get”首碼
char * GetFileName();
7) 對於設定某個數值的函數,加“Set”首碼
void SetMaxVolume();
8) 一般變數和結構名用名詞,函數名用動詞或動賓片語。
正確使用縮排
首先,一定要有縮排,否則代碼的層次不明顯。
縮排應為4個空格較好。需要縮排時一律按Tab鍵,或一律按空格鍵,不要有時用Tab鍵縮排,有時用空格鍵縮排。一般開發環境都能設定一個Tab鍵相當於多少個空格,此時就都用Tab鍵
2) 行寬與折行。
一行不要太長,不能超過顯示地區。以免閱讀不便。太長則應折行。折行最好發生在運算子前面,不要發生在運算子後面如
if( Condition1() && Condition2()
&& Condition3() ) {
}
3) 注意 ‘{’, ‘}’位置不可隨意,要統一
如果寫了:
if ( condition1() ) {
DoSomething();
}
別處就不要寫
if( condition2())
{
DoSomething() ;
}
4) 變數和運算子之間最好加1個空格
int nAge = 5;
nAge = 4;
if( nAge >= 4 )
printf( “%d”,nAge);
for( i = 0; i < 100; i ++ );
1)盡量不要用立即數,而用#define (C++中用const)定義成常量,以便以後修改
#define MAX_STUDENTS 20
struct SStudent aStudents [MAX_STUDENTS];
struct SStudent aStudents [20];
#define TOTAL_ELEMENTS 100
for( i = 0; i < TOTAL_ELEMENTS; i ++) {
}
2 )帶參數的宏定義應該在整個宏體外加括弧,而且宏參數都要用括弧包裹
#define SQUARE(x) x*x //平方
則 SQUARE(k+1); 變成 k+1*k+1; 錯
即使 #define SQUARE(x) (x)*(x)
也不保險
1/SQUARE(x);變成 1/(x)*(x);錯
應該:
#define SQUARE(x) ((x)*(x)) //平方
3)稍複雜的運算式中要積極使用括弧,以免優先順序理解上的混亂
n = k +++ j; //不好
n = ( k ++ ) + j; //好一點
4)不很容易理解的運算式應分幾行寫:
n = ( k ++ ) + j;應該寫成:
n = k + j;
k ++;
5)不提倡在運算式中使用 ? : 形式,而用if .. else語句替代
xp = 2 * k < ( n-m) ? c[k+1] : d[k--];
if( 2*k < (n-m))
xp = c[k+1];
else
xp = d[k--];
6)嵌套的if else 語句要多使用 { }
if( Condition1() )
if( condition2()
DoSomething();
else
NoCondition2();
不夠好,應該:
if( Condition1() ) {
if( condition2()
DoSomething();
else
NoCondition2();
}
7)應避免 if else 的多重嵌套,而用並列的完成。
if( Condition1() ) {
if ( Condition2() ) {
if( Condition3() ) {
Condition123();
}else {
NoCondition3();
}
}else {
NoCondition2();
}
}else {
NoCondiction1();
}
替換為:
if( ! condition1 ) {
NoCondition1();
}else if( ! condition2 ) {
NoCondition2();
}else if( ! condition3) {
NoCondition3();
}else {
Condition123();
}
8) 遵循一些慣例的寫法,如:
迴圈的固定寫法:
for( i = 0;i < n ;i ++ ) array[i] = 0;
而非 i = 0 ;
while( i <= n-1) array[i++] = 0;
死迴圈寫法:
for( ; ; ) { … } 或 while(1){ … }
9)寫出來的代碼應該容易讀出聲
比如
if( !( n > m ) && !( s > t))
就不如
if( ( m <= n ) && ( t <= s ))
if( !( c == 'y' || c == 'z'))
不如
if( c!= 'y' && c!= 'z');