关于goto的争议

tonyxiaohome 2009-08-20 11:41:02
坛子里回答大家问题,讨论到了goto。比较有代表性,这里摘录出来。

删除 回复#7阿东(C/C++爱好者) 13小时前
张初语(Java学生): vc不是开发环境么,c++是语言.一直以为是一样的呢,没想到还有这种区别啊.
上面的我也会,不过我的"会"肯定和肖老师的会不在同一个字典上.
果然是学得太肖兄:
4.类中静态数据成员,学了以后发现一直没用过
5.虚函数但是常用,有些特性没虚函数都感觉实现不了
6.从来不用异常,用goto------------------C++是反对用goto的难到正统的C程序不是这样吗。

编辑 删除 #9肖舸 12小时前
阿东(C/C++爱好者): 肖兄:
4.类中静态数据成员,学了以后发现一直没用过
5.虚函数但是常用,有些特性没虚函数都感觉实现不了
6.从来不用异常,用goto------------------C++是反对用goto的难呵呵,goto的用法,只要我说一次用goto,就有人反对一次。
上次开会,我公布我的编程规范,还差点打起来。
不过最后大家都还是用了,还觉得很好用。

人云亦云,自古有之,IT业也不能免俗啊。

事实上,大家想想,从1969年到现在,40年了,C语言没有取消goto语句,C++这么多年,居然也继承下来了,为什么?

那是因为每条语句一定有其特定的用途。具有不可替代性。

无数说面向对象编程的书籍,以及将模块化编程的书籍,对goto嗤之以鼻,视乎不批判goto就不足以说明自己的纯粹。

呵呵,先回到这里,我准备个例子传上来。

编辑 删除 #10肖舸 12小时前
例子一:不用goto,想想需要申请的指针是10个的话,程序怎么写?
void Func(void)
{
char* p1=null;
char* p2=null;
char* p3=null;

p1=(char*)malloc(10);
if(!p1) return;
p2=(char*)malloc(10);
if(!p2)
{
free(p1);
p1=null;
return;
}
p3=(char*)malloc(10);
if(!p3)
{
free(p1);
p1=null;
free(p2);
p2=null;
return;
}

//...

if(p1)
{
free(p1);
p1=null;
}
if(p2)
{
free(p2);
p2=null;
}
if(p3)
{
free(p3);
p3=null;
}
}
例子二:用goto
void Func(void)
{
char* p1=null;
char* p2=null;
char* p3=null;

p1=(char*)malloc(10);
if(!p1) goto Func_End_Process;
p2=(char*)malloc(10);
if(!p2) goto Func_End_Process;
p3=(char*)malloc(10);
if(!p3) goto Func_End_Process;

//...

Func_End_Process:
if(p1)
{
free(p1);
p1=null;
}
if(p2)
{
free(p2);
p2=null;
}
if(p3)
{
free(p3);
p3=null;
}
}



编辑 删除 #18肖舸 9小时前
四川大学锦江学院 黄启银(C/C++学生): 就是你上面用的那申请10个指针而不用GOTO语句这么说吧,程序开发中很多都有二元操作。
malloc-free
new-delete
lock-unlock
。。。
这种操作在实际工程应用中很多。
如果一个函数有多个出口,则在每个出口处,会产生巨大的退出代码,这样一来工作量大,程序员疲于奔命,二来全凭人脑记忆,稍微忘一件事情,就会出现内存泄漏,或者double-lock。
而这些bug,在运行时全部是随机产生,几乎无法寻找。
想想看,明天就要交活,而你还有个内存泄漏没找到,老板说,搞不定明天请你吃鱿鱼,你什么感觉?
又或者,你到客户处做技术维护,整个电信局机房的人都看着你,旁边还有竞争对手在进谗言,说这家公司就这水平,呵呵,你却发现有内存泄漏,系统运行2小时后会挂掉,一头的汗水,什么感觉?
所以我们规定,每个函数只能有一个出口,所有的资源释放必须放在出口统一解决,那么,不用goto,全部使用大括号,十几个,几十个if判断条件下来,你数数你的大括号有多深?根据缩进原则,屏幕宽度还够不?你还看得见你的代码吗?
这种代码可读性好不好?万一写错了,好不好找错误?
所有这些问题,一个goto就解决了。

肖舸
CSDN学生大本营个人主页:http://student.csdn.net/?39028
CSDN博客:http://blog.csdn.net/tonyxiaohome
...全文
187 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Darkneece 2009-08-21
  • 打赏
  • 举报
回复
goto受到唾弃因为它是底层的机制,完全无视了高级语言的结构化和模块化
晨星 2009-08-20
  • 打赏
  • 举报
回复
许多时候使用do { } while(false);中间再夹上一堆break;就够用了。
taodm 2009-08-20
  • 打赏
  • 举报
回复
0分讨论goto?这知识也太不值钱了吧。
yangyunzhao 2009-08-20
  • 打赏
  • 举报
回复
goto是把极厉害的双刃剑,非一定层次的高手不能用。
我自认还属于菜鸟,所以从不使用goto。

freshui 2009-08-20
  • 打赏
  • 举报
回复
我的error处理基本上都是用goto来做的, 方便,而且程序结构比较清晰
highball 2009-08-20
  • 打赏
  • 举报
回复
跳出深度循环,用goto更方便一些。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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