为什么转到糟糕的做法?

时间:2009-01-14 16:28:46

标签: goto

此问题与Goto Still Considered Harmful重复。如果您想进一步讨论,请使用原始问题。

为什么GOTO编程实践不佳?在某些情况下使用它是有道理的。

8 个答案:

答案 0 :(得分:4)

请注意,Djkstra写道“GOTO被认为是有害的”,而不是“GOTO被认为是致命的”。它有它的位置。不幸的是,知道何时使用它的判断来自于你在维护其他人的代码方面的经验,特别是几年前由不再在贵公司工作的人编写的代码。因此,在你有这种经历之前,最好尽可能避免转到。

答案 1 :(得分:3)

它基本上鼓励了糟糕的编码风格。见:Goto Considered Harmful [pdf]

答案 2 :(得分:2)

它可以迅速导致spaghetti code

答案 3 :(得分:1)

这意味着您没有在程序上设计代码。

如果你正确地构建了你的时间,那么你应该很少需要转到。

很少是关键词。有时候它很有用。从这个意义上说,现在很多人只是明确地抛出并捕获异常,只是为了避免可怕的转到。

答案 4 :(得分:1)

因为代码的结构很难理解。

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();
    }
}

答案 5 :(得分:0)

GOTO会缩短您的控制流量,从而破坏您的设计并打开调试和维护恶梦的大门。

答案 6 :(得分:0)

可读性成为一个问题,逻辑流可能会因使用goto而产生意想不到的影响。

我认为.net编译器会改变一些case / switch语句以使用goto很有趣。

答案 7 :(得分:0)

在某些情况下,这是有道理的。但是,在大多数情况下使用它它认为是不好的做法,因为与使用结构化代码(如for循环和while循环)相比,它可能使代码的执行路径难以阅读。

当您查看goto或标签时,如果没有阅读或搜索标签名称的代码,您实际上并不知道去往或来自哪里。这很棘手,特别是如果goto与标签不在同一屏幕上。将其与for循环或while循环或if ...进行比较,您可以从结构(即代码的缩进)中判断出执行路径是什么。

说到这一点,它有时是有用的,特别是例如当跳出一些嵌套的for循环时,这些循环正在挖掘多维数组中的特定值。当找到正确的值时,你可以使用goto跳出for循环。