什么时候是使用goto语句的好时机? (任何语言,任何问题)

时间:2011-02-21 21:17:18

标签: theory goto

我已经在我的CS课程中获得了一个任务,以便在使用goto语句并为其编写程序时提出一个好主意。它可以是任何情况(虽然我必须在3天内编写程序)到目前为止我还没有想到任何用递归或迭代无法轻易解决的问题。我唯一想到的就是河内的塔楼,但这只能用递归的几行来完成。你有什么建议吗?谢谢你的帮助。

编辑:它必须是实际的goto语句,而不是其他用于相同目的的语句。例如,通过建议切换,加注,抛出等回答的用户不适用于作业。

9 个答案:

答案 0 :(得分:1)

切换句子可以使用。

Actualy任何循环都在使用(internaly)CPU操作码goto指令!

但是,如果我们讨论的是高级语言,那么normaly就不需要使用goto语句了,但是汇编语言是一种正常的状态。

答案 1 :(得分:1)

使用goto的唯一时间是没有其他可用的控件构造可以提供该行为。

正如GJ所说,主要时间是你实际上没有任何东西可以进行迭代,就像你在集结地时一样。

答案 2 :(得分:1)

goto在程序中的用法应该是正确的,它会显示意大利面条代码的问题。

答案 3 :(得分:1)

这个C ++示例是有争议的:

if(a)
{
    ... // case 1
}
else if(b)
{
    if(c)
    {
        ... // case 1 again
    }
    else
    {
        ... // case 2
    }
}
else
{
    ... // case 3
}

这里的问题是您必须复制案例1的if()中的代码,或者您必须复制处理案例1的代码。在该示例中,处理代码是重复的。请参阅此备用no-goto解决方案:

if(a || (b && c))
{
    ... // case 1
}
else if(b && !c)
{
    ... // case 2
}
else
{
    ... // case 3
}

看起来很好,除非重复的代码非常复杂。然后你开始把事情搞砸到中间变量......将逻辑从需要的地方移开。

以下是使用goto的解决方案,该解决方案没有妥协:

if(a)
{
case1:
    ... // case 1
}
else if(b)
{
    if(c)
    {
        goto case1;// case 1 again
    }
    else
    {
        ... // case 2
    }
}
else
{
    ... // case 3
}

在C ++中,范围是需要考虑的。 C ++中的goto是关于自由地考虑范围而跳过执行的唯一方法。

即使有争议,我仍然不会在我给出的示例中使用goto,因为它使执行顺序复杂化。了解case1:的事物状态真的不是很直观。

答案 4 :(得分:1)

一个经常被忽视的观点是,GOTO可能只是一个可怕的意大利面条商业代码if/else陈述。

在你向我做出这样的声明之前,我要意识到业务逻辑可能非常复杂。我的意思是有时你唯一的选择是创建一堆布尔变量,在if / else乱码中设置/取消设置它们,然后在你从if / else嵌套转移到frob小部件之后在代码的后面部分当设置变量5而不是GOTO语句时。

那些“从不”这条线的人只表现出他们缺乏适应能力和无知。

答案 5 :(得分:0)

异常处理。

“加注”或“抛出”语句是一种转到。

答案 6 :(得分:0)

以下是一个例子:

while(...){
    switch(...){
     ...
     goto loop_done;       // break won't work here
    }
 loop_done: ...

答案 7 :(得分:0)

shix的回答是现场。 我发现goto的唯一合理用途是突破深度嵌套循环。

这是一个人为的例子:

#include <stdio.h>

int main()
{
  // find 6 positive numbers less than 100
  // , half odd
  // , half even
  // , that add up to a multiple of 123

  int n1, n2, n3, n4, n5, n6;

  for (n1 = 2; n1 < 100; n1+=2) 
    for (n2 = 2; n2 < 100; n2+=2) 
      for (n3 = 2; n3 < 100; n3+=2) 
        for (n4 = 1; n4 < 100; n4+=2) 
          for (n5 = 1; n5 < 100; n5+=2) 
            for (n6 = 1; n6 < 100; n6+=2) 
              if (((n1 + n2 + n3 + n4 + n5 + n6) % 123) == 0) 
                goto found; 

  printf("tested all numbers less than 100, couldn't find an answer\n");
  return 0;
found:
  int sum = n1 + n2 + n3 + n4 + n5 + n6;
  printf("answer: %d + %d + %d + %d + %d + %d = %d ( %% 123 is %d)\n", 
         n1, n2, n3, n4, n5, n6, sum, sum % 123);
  return 0;
}

答案 8 :(得分:0)

有一些非常随机的情况,在代码维护方面,goto可以更具可读性并且可能更安全。首先想到的是&#34;还有#34;代码问题:

//...

if(a)
{
    //do a
}
else if(b)
{
    //do b
}
else if(c)
{
    //do c
}
else goto skip_also_stuff;
{
    //if any if in the chain was true, do this too
    //do if a and b and c
}
skip_also_stuff:

//...

还有很多其他方法可以做到这一点,但大多数解决方案都会留下许多未来更换者可能忘记更新内容的地方。我发现这个解决方案更简单,因为它跳过了不必要的比较和/或代码重复。我所见过的所有语言的控制流程都具有逻辑性,或者#34;用else语句,但没有&#34;和&#34;像一个&#34;也&#34;言。