请问谁能总结一下goto语句现在的好处,与坏处(现在是2010年)

rome55 2010-02-16 04:33:59
总结一下goto语句的好处与坏处,
难道这个语句好处那么少吗?
谁能总结一次全面性的优缺点
好处:
坏处:
建议:


不胜感激
...全文
1182 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
adream307 2011-07-16
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 liang_lq 的回复:]
说gogo不好的人,能把13楼的程序改写一下吗?真心请教~~
[/Quote]

//c++版
#include<string>
#include<iostream>
#include<exception>
using namespace std;

int main()
{
try{
string p1("this is p1");
string p2("this is p2");
string p3("this is p3");
cout << p1 << endl;
cout << p2 << endl;
cout << p3 << endl;
}
catch(...){
return -1;
}
return 0;
}
//c版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char *p1;
char *p2;
char *p3;
int result=-1;
do{
p1=malloc(0x10 * sizeof(char));
if(NULL == p1)break;
strcpy(p1,"this is p1");

p2=malloc(0x10 * sizeof(char));
if(NULL == p2)break;
strcpy(p2,"this is p2");

p3=malloc(0x10 * sizeof(char));
if(NULL ==p3)break;
strcpy(p3,"this is p3");

printf("%s\n%s\n%s\n",p1,p2,p3);
result=0;
}while(0);
if(NULL != p1)free(p1);
if(NULL != p2)free(p2);
if(NULL != p3)free(p3);
return result;
}

ps:我觉得10楼的比较帅气。
qwrqwreqerqrw 2011-07-16
  • 打赏
  • 举报
回复
你别说书上还真是先讲到goto[Quote=引用 16 楼 malu_1982 的回复:]

引用 15 楼 markerhao 的回复:
个人感觉goto最大的优点就是很好理解,我当初刚学c的时候,学到goto 了,感觉可算有一个比较接近人类思维方式的东西了,想让程序到哪就到哪,多好啊,就好像是flah里面的gotoandplay,特别喜欢goto,但是谭浩强说不好,说的理由估计楼上的也都说全了,于是我就忍痛割爱,把这个东西放下了,后来while if等语句用的熟一点了,就感觉got……
[/Quote]
liang_lq 2010-07-07
  • 打赏
  • 举报
回复
说gogo不好的人,能把13楼的程序改写一下吗?真心请教~~
forster 2010-02-21
  • 打赏
  • 举报
回复
不用goto 也给你编译成goto 何必自欺欺人
  • 打赏
  • 举报
回复
没用过goto的人飘过.....
forcal 2010-02-21
  • 打赏
  • 举报
回复
谨慎用吧,和上面人说的恰恰相反的是,用goto可以让人觉得你很落后!
abc881858 2010-02-21
  • 打赏
  • 举报
回复
放心用吧,和上面人说的恰恰相反的是,用goto可以让人觉得你很厉害!
whz_time 2010-02-19
  • 打赏
  • 举报
回复
建议: 在一个function中, 如果有goto, 不要goto到两个或者两个以上的地方, 允许多个goto, 但是都goto到同一个地方, 这样在逻辑上不至于太混乱.
bdxxxx 2010-02-19
  • 打赏
  • 举报
回复
我还是觉得最好不要用,严重影响阅读
Xuefer 2010-02-19
  • 打赏
  • 举报
回复
相比 mnzn2530 的例子, 我给的例子更说明 goto/多个label发挥作用, 繁琐程度换成别的写法差别更大
另外 mnzn2530 的例子其实 delete 不需要判断指针是否 null, free 才需要. 不过无伤大雅了
Xuefer 2010-02-19
  • 打赏
  • 举报
回复
避免随意用 goto, 如果用就限制自己用的条件/情况, 以及限制写出来的风格

int a()
{
int ret = -1;
O *o1 = open_xxx();
if (!xxx_read(o1)) goto err_o1;
O *o2 = open_xxx();
if (!xxx_write(o1)) goto err_o2;

.....
ret = 0;
......

:err_o3
close_xxx(o2);
:err_o2
close_xxx(o1);
:err_o1
return ret;
}


可以看到上面的 goto 是最简单的把一些数据"回滚"或者"清理"掉的方法
不用goto采用直接return的话则是


int a()
{
int ret = 0;
O *o1 = open_xxx();
if (!xxx_read(o1)) {
close_xxx(o1);
return -1;
}
O *o2 = open_xxx();
if (!xxx_write(o1)) {
close_xxx(o1);
close_xxx(o2);
return -1;
}
// 以此类推, 后面的 return 都得把前面的一堆东西都清理掉才能return
if ....
return 0;
}



c++ 用 RTII 的话没必要用 goto/exception 来清理数据, goto 主要用途(不是指本身具备的功能)是用来做一些错误处理
MagiSu 2010-02-19
  • 打赏
  • 举报
回复
顺带说一句,break和continue的本质就是goto。只不过编译器自动的在适当的位置加上了标号不用你管理而已。
MagiSu 2010-02-19
  • 打赏
  • 举报
回复
Knuth那片文章的意思就是GOTO没有那么坏,只要能够清楚的表达程序员的意图即可。
forcal 2010-02-19
  • 打赏
  • 举报
回复
goto能提高运行效率,减少目标代码长度,有时能提高可读性。
有时候,不知不觉就用了goto。
delacrxoix_xu 2010-02-19
  • 打赏
  • 举报
回复
好处在25搂

下面再说一个好处,goto可以代替递归,避免内存的过多占用。

这是递归的
void PrintList(List L)
{
if(L != NULL)
{
PrintElement(L->Element);
PrintList(L->Next);
}
}
这是用goto的
void PrintList(List L)
{
top:
if(L != NULL)
{
PrintElement(L->Element);
L = L->Next;
goto top;
}
}


坏处上面好多人都讲了,破坏结构性,降低可读性,维护难度增大,这些都是没用好goto语句导致的。

有个例子可以很好的说明问题:Linux-2.6.21内核使用了20,333个goto语句,VxWorks-6.2则使用了9142个,最后941个goto语句被运用到了rtems-4.9.2中;另外,glibc-2.9库使用了1750个goto语句
goto语句直接对应于汇编里面的jmp,所以好多老程序员由于习惯问题,仍然喜欢使用goto。

建议:
1) 不要过份地使用。因为有时程序还没有分配资源,所以直接返回显得更加的直接了当。还有就是,在这个函数中如果存在使用goto语句都意味着出错了且需要释放资源。
2) 不要让goto语句形成一个环。使用goto语句应形成一条线,从一点跳到另一点。当然,如果goto语句的使用没有破坏可读性,那可以适当的考虑打破这一原则。
Xuefer 2010-02-19
  • 打赏
  • 举报
回复
上面2个, 一个有goto一个没有goto, 你喜欢哪个? 或者你能给出更好的写法?
vvilp 2010-02-18
  • 打赏
  • 举报
回复
其实没什么坏处。。。只不过就是放不方便看而已

goto有害? 那以前汇编的程序员是怎么活过来的?
huliang66 2010-02-18
  • 打赏
  • 举报
回复
我调别人写的一个程序,用了一大堆goto,简直就是灾难啊
wangxing221 2010-02-18
  • 打赏
  • 举报
回复
knuth曾写过一篇文章分析过goto的优缺点
  • 打赏
  • 举报
回复
GOTO的一个特点是可以往前跳吧?
这个特点没有其它方法能代替吧?
加载更多回复(27)

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧