goto之错,谁知错?

偶然间想到一个问题,在论坛里面也经常被提起,而且是一个常提常新的话题,那就是跳转语句中的goto有错吗?在各方面观念冲突,观点很难一致的情况下,我们来分析一下这个存在争议的问题。
很多标准规、范定的很死,"禁止使用goto",一些公司面试笔试问题中也经常会出这种问题,那么我们的问题就产生了,为什么不让用goto。goto真的是恶魔? 是梦魇?是灾难之源吗?
不用goto是不是一个好习惯?我想既然讨论这个问题,就从他的各个方面来分析!

观点1:goto乃神兵利器
goto的优点:林锐博士在《高质量c/c++编程》中提到,使用什么能从一个多重循环嘎的一下跳出来? 答案就是goto,这也说明还是有不少人赞成使用goto的,能清晰地表达出流程
[code=C/C++]
for(......)
{
    for(....)
    {
        for(.....)
        {
           // 如何冲出重重包围? break? no,no, return ? no, no ,you can choose "goto"
        }
    }
}
[/code]
break;只能跳出单层的循环,return将整个函数都返回了,没法再继续了,显然也不行,所以我们想到了goto,在当前函数栈你可以任意发挥了:) good luck-_-

观点2:goto也是个恶魔
goto的缺点:这个大家都知道,用过goto的程序员都会有个想法,goto很好用,跳转非常方便,但是另一方面,误用造成的危害也是惨重的。why? 举个例子

[code=C/C++]
A: //code section A
   //code
   goto B;
   //code
   goto C;
B: //code section B
   //code
   goto A;
   //code
   goto C;
C: //code section C
   //code
   //goto B;
   //code
   goto A;
[/code]
这样好像已经能够说明问题了,随着标签的增多,带来的混乱局面是很难扭转的,对调试,走读,理解代码都会造成很大的障碍,如果你写这样的代码,那代码维护绝对会是一场噩梦。

观点3:goto是不是万能的
goto的限制:goto不是万能的,不能随便跳转,只能局限于当前函数体内,如果你试图跳转到其他地方,也许jmp该是你的选择,理解了吗? goto不能做到从一个函数跳转到其他函数或是别的地方。


我们给出一个观点:
goto是一把双刃剑,我们可以好好使用它,让它为我们造福,就像我们使用铀,使用紫外线,使用毒一样,要让它"各得其所"
goto使用的一个很好的例子就是指定函数的统一出口,什么意思? example:
[code=C/C++]
BOOL Func(parameters list)
{
    if(check param)
    {
       goto Func_Exit;
    }
    //code
    char *p = new char[n];
    if(!p)
    {
       goto Func_Exit;
    }

Func_Exit:
   //Do something when exceptions happen
}
[/code]


不管代码结构如何,使用了循环,判断,goto一下就跳到处理的位置。方便,真方便。

我们分析了goto的优点,也分析了goto的弱点,因此我们完全可以区分何时使用goto
我们说goto不是万能的,没有goto也不是万万不能的,因为你完全可以是用其他跳转来解决这个问题。
但是我们还是希望它能发挥作用。那就是如果goto不影响你的代码结构,不造成混乱的情况下,让它为您效劳吧! 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值