设为首页 加入收藏

TOP

建议16:慎用goto
2013-10-07 14:47:20 来源: 作者: 【 】 浏览:53
Tags:建议 慎用 goto

建议16:慎用goto

如果说有一个关键字在C/C++(www.cppentry.com)语言程序中备受争议,那么非程序跳转关键字goto莫属。在早期的BASIC和FORTRAN语言中,goto备受依赖,为了照顾部分程序员的设计习惯,在C语言中goto关键字依然得到了保留。然而,与前面两种语言有所不同,goto在C/C++(www.cppentry.com)语言中就像一个多余的外来户,有没有它几乎不影响C语言程序的设计与运行,它没有带来太大的正面作用,相反却容易破坏程序的结构性。所以,Kernighan和Ritchie认为goto语句“非常容易被滥用”,并且建议“一定要谨慎使用,或者干脆不用”。

之所以建议避免使用goto,是因为C/C++(www.cppentry.com)语言中提供了更好的方式去实现goto的功能。为了帮助部分程序员克服goto依赖症,接下来我会分别介绍以下情形下goto语句的替换方式:

if控制内的多条语句

如果熟悉旧风格的BASIC和FORTRAN,会知道只有紧跟在if条件后的那一条语句才属于该if的控制域,所以就出现了以下goto的使用形式:

  1. Size = 20;  
  2. Flag = 1;  
  3. if( price > 15)  
  4.    goto A_PLAN;  
  5. goto B_PLAN;  
  6. A_PLAN:  
  7.    Size /=2;  
  8.    Flag = 3;  
  9. B_PLAN:  
  10.    Money = price * Size * Flag; 

而在C/C++(www.cppentry.com)语言中,复合语句或代码块很容易实现上述目的,而且使代码更加清晰可读,如下所示:
  1. Size = 20;  
  2. Flag = 1;  
  3. if( price > 15)  
  4. {  
  5.   Size /=2;  
  6.   Flag = 3;  
  7. }  
  8. Money = price * Size * Flag; 

不确定循环

首先请看如下代码:

  1. ReadScore:  
  2. scanf("%d", &Score);  
  3. if(Score < 0 )  
  4.      goto ErrorStage;  
  5. ... // Processing codes  
  6. goto ReadScore;  
  7. ErrorStage:  
  8. ... // Error Processing 

这种情形可以用我们熟知的while循环来完美代替:
  1. scanf("%d", &Score);  
  2. while(Score >= 0)  
  3. {  
  4.      ... // Processing codes  
  5.      scanf("%d", &Score);  

此外,如果跳转到循环结尾会开始新一轮循环,可以使用continue代替;如果要跳出循环,那就使用break。

上述goto语句破坏了程序的结构性,影响了程序的可读性,这在C/C++(www.cppentry.com)程序员看来是难以容忍的。然而,有一种goto的使用情形为许多C/C++(www.cppentry.com)程序员所接受,那就是程序在一组嵌套循环中出现错误,无路可走时的跳转处理,如下所示:

  1. while(... )  
  2. {  
  3.      for(...)  
  4.      {  
  5.         for(...)  
  6.         {  
  7.             Processing statement;  
  8.             if(error)  
  9.                 goto ERROR;  
  10.         }  
  11.         More processing statement;  
  12.     }  
  13.     Yet more processing statement;  
  14. }  
  15. And more processing statement;  
  16. ERROR:  
  17.      Deal_With_Error Statement; 

请记住:

过度使用goto会使代码流程错综复杂,难以理清头绪。所以,如果不熟悉goto,不要使用它;如果已经习惯使用它,试着不去使用。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇建议15:尽量不要使用可变参数(1.. 下一篇建议18:正确区分void与void*

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: