偶然间想到一个问题,在论坛里面也经常被提起,而且是一个常提常新的话题,那就是跳转语句中的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不影响你的代码结构,不造成混乱的情况下,让它为您效劳吧!