良好的编程风格
匈牙利命名法为C程序标识符的命名定义了一种非常标准化的方式,这种命名方式是以两条规则为基础的:
a. 变量的名字以一个或者多个小写字母前缀开头,前缀能够体现变量数据类型、作用域等信息。
b. 在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了该标识符的作用
a. 变量的名字以一个或者多个小写字母前缀开头,前缀能够体现变量数据类型、作用域等信息。
b. 在标识符内,前缀以后就是一个或者多个第一个字母大写的单词,这些单词清楚地指出了该标识符的作用
1
)变量命名加前缀
c char
s short
n int nDoorNum
l long
b boolean取值只为真和假的整型变量 如 bValid
f float 浮点数
d double
a 数组 a[ 5 ]
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))
但是常用的意义明显的变量,如 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 含义就不十分明显
为全局变量取长的,描述信息多的名字,为局部变量取短名字
名字太长时可以适当采用单词的缩写。但要注意,缩写方式要一致。要缩写就全都缩写。
比如 单词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 ) 一般变量和结构名用名词,函数名用动词或动宾词组。
int IsCanceled();
int isalpha(); // C语言标准库函数
BOOL IsButtonPushed();
6 ) 对于获取某个数值的函数,加 “Get”前缀
char * GetFileName();
7 ) 对于设置某个数值的函数,加“Set”前缀
void SetMaxVolume();
8 ) 一般变量和结构名用名词,函数名用动词或动宾词组。
正确使用缩进
首先,一定要有缩进,否则代码的层次不明显。
缩进应为4个空格较好。需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。一般开发环境都能设置一个Tab键相当于多少个空格,此时就都用Tab键
首先,一定要有缩进,否则代码的层次不明显。
缩进应为4个空格较好。需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。一般开发环境都能设置一个Tab键相当于多少个空格,此时就都用Tab键
2
) 行宽与折行。
一行不要太长,不能超过显示区域。以免阅读不便。太长则应折行。折行最好发生在运算符前面,不要发生在运算符后面如
if ( Condition1() && Condition2()
&& Condition3() ) {
}
一行不要太长,不能超过显示区域。以免阅读不便。太长则应折行。折行最好发生在运算符前面,不要发生在运算符后面如
if ( Condition1() && Condition2()
&& Condition3() ) {
}
3
) 注意 ‘{’, ‘}’位置不可随意,要统一
如果写了:
if ( condition1() ) {
DoSomething();
}
别处就不要写
if ( condition2())
{
DoSomething() ;
}
如果写了:
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 ++ );
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 ++ ) {
}
#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)) // 平方
#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 ++ ;
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 -- ];
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();
}
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();
}
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 ){ … }
循环的固定写法:
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 ' );
比如
if ( ! ( n > m ) && ! ( s > t))
就不如
if ( ( m <= n ) && ( t <= s ))
if ( ! ( c == ' y ' || c == ' z ' ))
不如
if ( c != ' y ' && c != ' z ' );