这个问题是 Goto Still Considered Harmful的副本。如果您想进一步讨论这个问题,请使用原始问题。
为什么 GOTO 编程习惯不好?在某些情况下使用它是有意义的。
为什么 GOTO 编程习惯不好?在某些情况下使用它是有意义的。
请注意,Djkstra 写的是“GOTO 被认为是有害的”,而不是“GOTO 被认为是致命的”。它有它的位置。不幸的是,要知道何时使用它的判断来自于您在维护其他人的代码方面有一些经验,尤其是几年前不再在您公司工作的人编写的代码。因此,在您有这种经验之前,最好尽可能避免使用 goto。
基本上,它鼓励糟糕的编码风格。参见:Goto 被认为是有害的[pdf]
它可以迅速导致意大利面条代码。
这意味着您还没有按程序设计代码。
如果你正确地构建你的whiles和ifs,你应该很少需要goto。
很少是关键词。有时它很有用。从这个意义上说,现在很多人只是显式地抛出和捕获异常,只是为了避免可怕的 goto。
因为代码的结构可能难以遵循。
这个
y:
// do more stuff
goto x
p:
// do stuff
// then done
goto y;
x:
// do a bunch of stuff
if (...)
goto y;
else
goto p;
done:
远不如
int main()
{
x();
}
function p()
{
if (...)
{
return;
}
}
function x()
{
if (...)
{
return;
}
else
{
p();
}
}
GOTO 会使您的控制流程短路,从而破坏您的设计并为调试和维护噩梦打开大门。
可读性成为一个问题,并且逻辑流可能会因使用 goto 而产生意想不到的影响。
我认为 .net 编译器将更改一些 case/switch 语句以使用 goto 很有趣。
在某些情况下,这是有道理的。但是,在大多数情况下,使用它被认为是不好的做法,因为与使用诸如 for 循环和 while 循环之类的结构化代码相比,它会使代码的执行路径难以阅读。
当您查看 goto 或标签时,如果不阅读或搜索标签名称的代码,您真的不知道去往或来自哪里。这很棘手,特别是如果 goto 不适合与标签在同一屏幕上。将此与 for 循环或 while 循环或 if.. 进行比较。您可以从结构(即代码的缩进)中看出执行路径是什么。
话虽如此,它有时还是很有用的,尤其是当跳出一些嵌套的 for 循环时,这些循环正在挖掘多维数组中的特定值。当找到正确的值时,您可以在此处使用 goto 跳出 for 循环。