Thursday, November 23, 2006

《code reading》阅读笔记之一

开始读第二章了,值得关注的有:
  1. 编译器的告警开关全部打开,且对告警信息按照错误处理(gcc还有些告警选项是在优化开关打 开后才能生效,如警告使用了未初始化的变量就是这种情况,即使使用了-Wall也没用;我暂时得出的结论是打开-Wall -Wuninitialized -Werror -O1 -g会比较严谨;注意,gcc允许既带调试信息,同时加以优化!intel的编译器没有上述问题)
  2. 使用支持语言语法加亮的编辑器,更早的暴露代码的问题
  3. 代码的排版很重要,可以采用indent之类的工具,但对一些具体问题(如8个?的解决方案),可考虑手工排版:越是复杂的语句,越要使语句的主干得到清晰的展现
  4. 变量的命名能反映其实际含义
  5. 熟悉了一下gdb的使用,常用命令file,run,info breakpint,breakpoint n,print v,watch v,list,enable n(断点号),clear n(行号),next,step,x;
  6. 不理解为什么netbsd的二分法查询这么别扭,下面的代码可读性更好(参考R Sedgewick Algorithms in C,被注释掉的是原来的实现)
int main(int argc, char *argv[])
{
int * pi,pl,pr;
int * pbase;
int i[10]={0,1,2,3,4,5,6,7,8,9};
int lim=10;
int key;
pl=pbase=i;
pr=lim-1;

key=atoi(argv[1]);

while (pr>=pl){
int m=(pr+pl)/2;
int cur_value=*(i+m);
if (key == cur_value){
printf("at index %d found value %d\n",m,key);
return 0;
}
if (key > cur_value)
pl=m+1;
else
pr=m-1;
}
/*for (;lim!=0;lim>>=1)
{
pi=pbase+(lim>>1);
printf("lim value is %d\n",lim);
if (*pi==key){
printf("at index %d got %d!\n",(pi-i),key);
return;
}
if (key>*pi){
pbase=pi+1; 虽然结果正确,可惜看不懂
lim--;
}

}*/
printf("not got u!\n");
return 0;
}

0 comments: