gnu coreutils-4.5.1 comm.c 代码分析2


这个代码曾读过,当时曾为其比较算法而惊喜。是的,作者写得真妙。就象一队男人和一队女人进去玩,要求一男一女搭配,男人和女人一样高。
先第一个男的和第一个女的比较,相等就进去,再比较下一对。
如果第一个男的和女的高度不等,就让高的不同,让矮的下一位继续比较,因为数据是排过序的。
今天接着复习,代码要经常看,才能看出味道来。我为
writeline (const struct linebuffer *line, FILE *stream, int class)
{
  switch (class)
    {
    case 1:
      if (!only_file_1)
 return;
      break;
    case 2:
      if (!only_file_2)
 return;
      /* Print a TAB if we are printing lines from file 1.  */
      if (only_file_1)
 putc ('\t', stream);
      break;
    case 3:
      if (!both)
 return;
      /* Print a TAB if we are printing lines from file 1.  */
      if (only_file_1)
 putc ('\t', stream);
      /* Print a TAB if we are printing lines from file 2.  */
      if (only_file_2)
 putc ('\t', stream);
      break;
    }
  fwrite (line->buffer, sizeof (char), line->length, stream);
}
这个函数而迷糊了,在switch中有return语句,会如何?我想不明白,于是自己写测试代码,原来,return语句就是结束程序的执行。而break呢,则跳 出switch,如果
while(1)
 switch(c)
     break;
那break到底是跳 出switch呢,还是跳 出while?
看来,我的C语言,学得不够精。
作者写这个writeline子程序,有些模糊,总感觉不清晰。读了后抓不住概念。《unix编程艺术》的作者说,diff是围绕序列比较算法的简单包装,lex是围绕NFA的简单包装,yacc是围绕lr(1)的包装,他说理解了算法,就一切明白了,没理解算法,就很难理解。我现在对writeline这么写,也很难理解。

猜你喜欢

转载自blog.csdn.net/woshiyilitongdouzi/article/details/80490889