|
29、尽量用for而不是while做循环
---------------
基本上来说,for可以完成while的功能,我是建议尽量使用for语句,而不要使用while语句,特别是当循环体很大时,for的优点一下就体现出来了。
因为在for中,循环的初始、结束条件、循环的推进,都在一起,一眼看上去就知道这是一个什么样的循环。刚出学校的程序一般对于链接喜欢这样来:
p = pHead;
while ( p ){
...
...
p = p->next;
}
当while的语句块变大后,你的程序将很难读,用for就好得多:
for ( p=pHead; p; p=p->next ){
..
}
一眼就知道这个循环的开始条件,结束条件,和循环的推进。大约就能明白这个循环要做个什么事?而且,程序维护进来很容易,不必像while一样,在一个编辑器中上上下下的捣腾。
30、请sizeof类型而不是变量
-------------
许多程序员在使用sizeof中,喜欢sizeof变量名,例如:
int score[100];
char filename[20];
struct UserInfo usr[100];
在sizeof这三个的变量名时,都会返回正确的结果,于是许多程序员就开始sizeof变量名。这个习惯很虽然没有什么不好,但我还是建议sizeof类型。
我看到过这个的程序:
pScore = (int*) malloc( SUBJECT_CNT );
memset( pScore, 0, sizeof(pScore) );
...
此时,sizeof(pScore)返回的就是4(指针的长度),不会是整个数组,于是,memset就不能对这块内存进行初始化。为了程序的易读和易维护,我强烈建议使用类型而不是变量,如:
对于score: sizeof(int) * 100 /* 100个int */
对于filename: sizeof(char) * 20 /* 20个char */
对于usr: sizeof(struct UserInfo) * 100 /* 100个UserInfo */
这样的代码是不是很易读?一眼看上去就知道什么意思了。
另外一点,sizeof一般用于分配内存,这个特性特别在多维数组时,就能体现出其优点了。如,给一个字符串数组分配内存,
/*
* 分配一个有20个字符串,
* 每个字符串长100的内存
*/
char* *p;
/*
* 错误的分配方法
*/
p = (char**)calloc( 20*100, sizeof(char) );
/*
* 正确的分配方法
*/
p = (char**) calloc ( 20, sizeof(char*) );
for ( i=0; i<20; i++){
/*p = (char*) calloc ( 100, sizeof(char) );*/
p = (char*) calloc ( 100, sizeof(char) );
}
(注:上述语句被注释掉的是原来的,是错误的,由dasherest朋友指正,谢谢)
为了代码的易读,省去了一些判断,请注意这两种分配的方法,有本质上的差别。
31、不要忽略Warning
----------
对于一些编译时的警告信息,请不要忽视它们。虽然,这些Warning不会妨碍目标代码的生成,但这并不意味着你的程序就是好的。必竟,并不是编译成功的程序才是正确的,编译成功只是万里长征的第一步,后面还有大风大浪在等着你。从编译程序开始,不但要改正每个error,还要修正每个warning。这是一个有修养的程序员该做的事。
一般来说,一面的一些警告信息是常见的:
1)声明了未使用的变量。(虽然编译器不会编译这种变量,但还是把它从源程序中注释或是删除吧)
2)使用了隐晦声明的函数。(也许这个函数在别的C文件中,编译时会出现这种警告,你应该这使用之前使用extern关键字声明这个函数)
3)没有转换一个指针。(例如malloc返回的指针是void的,你没有把之转成你实际类型而报警,还是手动的在之前明显的转换一下吧)
4)类型向下转换。(例如:float f = 2.0; 这种语句是会报警告的,编译会告诉你正试图把一个double转成float,你正在阉割一个变量,你真的要这样做吗?还是在2.0后面加个f吧,不然,2.0就是一个double,而不是float了)
不管怎么说,编译器的Warning不要小视,最好不要忽略,一个程序都做得出来,何况几个小小的Warning呢?
|
|