你用不用goto,说出理由

majia777 2006-10-22 11:36:21
用和不用都说出理由
...全文
1772 119 打赏 收藏 转发到动态 举报
写回复
用AI写文章
119 条回复
切换为时间正序
请发表友善的回复…
发表回复
hai1039 2006-10-26
  • 打赏
  • 举报
回复
goto属于“原生态”的语句,过多过容易地使用它,往往是程序员没有开动脑筋去找更好解决方案的标志。就好象在c/c++里大量使用1-3个字母的变量名一样。
Metawolf 2006-10-26
  • 打赏
  • 举报
回复
其实少用goto并不是goto不好用.而是他有一些副作用,如果你能意识到这些副作用,那么你用一些goto并没有什么后果,但是如果你不小时忽略了些什么,那么最后辛苦的还是你自己,而且goto如果不是用的太好,会破坏一些逻辑
nextec 2006-10-26
  • 打赏
  • 举报
回复
linux系统的代码,哈哈,通篇的goto啊
一个程序如果把执行效率放在第一位,那就找不到理由不用goto
还有在编写自动机的时候,不用goto你用什么呢?
wyp2120 2006-10-26
  • 打赏
  • 举报
回复
其实滥用GOTO也有好处哦,用个几百个,看谁有那个耐心去破解你的程序,看都看死他,哈哈哈哈。在工作的时候少用为妙哦~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LS_Winson 2006-10-26
  • 打赏
  • 举报
回复
BOOL f()
{
bool bSucc = false;
char *s = new char[500];
...
if(!(there is an error1))
{
....
if(!(there is an error2))
{
...
if(!(there is an errorN))
{
....
bSucc = true;
}
}
}
}
delete [] s;
return bSucc;
}
这样嵌套太多的条件分支语句,感觉也不是很好,如果error的个数大于10,代码会变成什么样子呢?
有没有更好的方法呢?

BOOL f()
{
bool bSucc = false;
char *s = new char[500];
...
if(!(there is an error1))
{
throw error1
}
...
if(!(there is an error2))
{
throw error2
}
...
if(!(there is an errorN))
{
throw errorN
}
bSucc = true;




return bSucc;
}

catch(error)
{
switch(error)
{
case error1:
case error2:
....
....
..
}

这样的代码就可以比较整洁了,一旦出错就完全离开程序块,阅读程序的时候完全就可以暂时忽略错误处理
LS_Winson 2006-10-26
  • 打赏
  • 举报
回复
如果碰到下面情况呢?
使用if检查某条件, 不符合条件就应该清理资源, 退出(而且如果用逻辑或连接条件反而不清晰):
if(a1) ... goto cleanup;
if(a2) ... goto cleanup;
if(an...) ... goto cleanup;

cleanup:
close(fd);

你看,你不觉得那个cleanup就象个函数吗?不妨做成函数来用.
至于try/catch/throw 如果是出错处理,当然挺好,但如果不是出错处理也用它们就不太好了,容易混乱的
xiaohuoma7620 2006-10-25
  • 打赏
  • 举报
回复
好的,我研究一下
eyelash0920 2006-10-25
  • 打赏
  • 举报
回复
其实是可以用的,面向对象技术虽然不提倡用goto这样的语句,但是只要不向前goto就可以。而且有时候使用goto可以保证程序的单一出口,这样比较规范。
hai1039 2006-10-25
  • 打赏
  • 举报
回复
那就用try/catch/throw

和goto比,这个不会跳到前面,不会跳到里面,而一般用throw都知道是错误处理。
xiaohuoma7620 2006-10-25
  • 打赏
  • 举报
回复
要尽可能地复用,减少重复代码.

BOOL f()
{
bool bSucc = false;
char *s = new char[500];
...
if(!(there is an error1))
{
....
if(!(there is an error2))
{
...
if(!(there is an errorN))
{
....
bSucc = true;
}
}
}
}
delete [] s;
return bSucc;
}
这样嵌套太多的条件分支语句,感觉也不是很好,如果error的个数大于10,代码会变成什么样子呢?
有没有更好的方法呢?
hai1039 2006-10-25
  • 打赏
  • 举报
回复
要尽可能地复用,减少重复代码.

BOOL f()
{
bool bSucc = false;
char *s = new char[500];
...
if(!(there is an error1))
{
....
if(!(there is an error2))
{
...
if(!(there is an errorN))
{
....
bSucc = true;
}
}
}
}
delete [] s;
return bSucc;
}
xiaohuoma7620 2006-10-25
  • 打赏
  • 举报
回复
BOOL f()
{
char *s = new char[500];
...
if(there is an error1)
{
delete [] s;
return FALSE;
}
if(there is an error2)
{
delete [] s;
return FALSE;
}
...
if(there is an errorN)
{
delete [] s;
return FALSE;
}
delete [] s;
return TRUE;
}
这种情况下用goto比较好吧,如果不用的话,不知道是不是必须这么写,请教了。
redex 2006-10-25
  • 打赏
  • 举报
回复
我说得这种情况好象在linux内核中用得也比较多
redex 2006-10-25
  • 打赏
  • 举报
回复
to: wolfinrain(雨狼)

"if(a1 ||a2||an)
close(fd)"

----事实上那些条件在逻辑上没什么联系, 如果写成如上的形式,
对于程序的易读性是非常没有好处的
cuiningsb 2006-10-24
  • 打赏
  • 举报
回复
有些人的观点就是太偏激太极端了
要么就主张彻底不用
要么就说goto有多好

goto真要一无是处
就不会存在了

跟goto比
汇编语言里大量的jmp岂不是更加不能用?
汇编语言岂不是不能用?

强大的东西就看你自身水平能不能驾驭了
专业相机在专业人士手里就很好用 能拍出很好的作品
但是一旦跑到业余人士手里 就变的不怎么好用
然后还会去说 专业相机如何如何不如傻瓜相机

我的观点是
该用的地方就用
不该用的地方就不用
适合用什么就用什么
没必要为了用goto而用goto
更没必要为了避免使用goto关键字而舍近求远用跟goto如出一辙的东西
追求形式上的没有goto 而实质上有goto 是不可取

实际上
goto仅仅表示一种条件跳转
程序的流程图上有没有这种跳转就决定了这个程序里有没有goto
而不是搜索一下代码里面有没有用goto这个关键字

可以说
Java里面也可以有goto
只是没出现这个关键字而已
=====================================================
非常同意
Metawolf 2006-10-24
  • 打赏
  • 举报
回复
RESOURCE r1 , r2 , r3;

if( ( r1 = getR1() ) )
{
if( r2 = getR2() )
{
if(r3 = getR3())
{
// use r1 r2 r3
releaseR3( r3 );
}
releaseR3( r2 );
}
releaseR3( r1 );
}
这样呢.
sjjf 2006-10-24
  • 打赏
  • 举报
回复
知因而不知革,物失其则,知革而不知因,物失其均.
lmfilwcx5211314 2006-10-24
  • 打赏
  • 举报
回复
因人而异!!!
mLee79 2006-10-24
  • 打赏
  • 举报
回复
没有比下面的性能更好的代码了 .....
说 goto 影响性能更是胡说八道, if while for 最后同样使用跳转指令, 何况无条件跳转根本就不影响预取指令队列, 条件跳转指令也只在分支预测失败的时候才影响预取指令队列 ...

RESOURCE r1 , r2 , r3;

if( !( r1 = getR1() ) ) FAILED;
if( !( r2 = getR2() ) ) goto cleanR1;
if( !( r3 = getR3() ) ) goto cleanR2;

// use r1 r2 r3

cleanR3: releaseR3( r3 );
cleanR2: releaseR2( r2 );
cleanR1: releaseR1( r1 );


pcboyxhy 2006-10-24
  • 打赏
  • 举报
回复
有些人的观点就是太偏激太极端了
要么就主张彻底不用
要么就说goto有多好

goto真要一无是处
就不会存在了

跟goto比
汇编语言里大量的jmp岂不是更加不能用?
汇编语言岂不是不能用?

强大的东西就看你自身水平能不能驾驭了
专业相机在专业人士手里就很好用 能拍出很好的作品
但是一旦跑到业余人士手里 就变的不怎么好用
然后还会去说 专业相机如何如何不如傻瓜相机

我的观点是
该用的地方就用
不该用的地方就不用
适合用什么就用什么
没必要为了用goto而用goto
更没必要为了避免使用goto关键字而舍近求远用跟goto如出一辙的东西
追求形式上的没有goto 而实质上有goto 是不可取

实际上
goto仅仅表示一种条件跳转
程序的流程图上有没有这种跳转就决定了这个程序里有没有goto
而不是搜索一下代码里面有没有用goto这个关键字

可以说
Java里面也可以有goto
只是没出现这个关键字而已

加载更多回复(99)

64,639

社区成员

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

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