代码之家  ›  专栏  ›  技术社区  ›  user142019

使用goto有什么问题?[副本]

  •  89
  • user142019  · 技术社区  · 16 年前


    Why is it bad to use goto?
    GOTO still considered harmful?

    我正在浏览xkcd,看到了这篇文章(如果几年前也读过一些关于它们的负面文章的话):
    your slow connection sucks, get a faster one to see this image
    它到底有什么问题?那么为什么C++中的Goto甚至可能呢?

    不 使用它们?

    6 回复  |  直到 9 年前
        1
  •  135
  •   gsamaras a Data Head    7 年前

    因为它们会导致 spaghetti code .

    在过去,编程语言没有while循环、if语句等,程序员使用goto来组成程序的逻辑。它会导致无法维护的混乱。

    这就是CS神创建方法、条件和循环的原因。 Structured 编程在当时是一场革命。

        2
  •  84
  •   bta    8 年前

    没有什么不对的 goto 转到

    转到 可能有用。主要示例如下:

    for (i = 0; i < 1000; i++) {
        for (j = 0; j < 1000; j++) {
            for (k = 0; k < 1000; k++) {
                ...
                if (condition)
                    goto break_out;
                ....
            }
        }
    }
    break_out:
    

    使用 转到 跳出深度嵌套的循环通常比使用条件变量并在每个级别上检查它更干净。

    子程序的实现是其被滥用的主要方式。这就产生了所谓的“意大利面代码”,不必要地难以阅读和维护。

        3
  •  37
  •   JaredPar    16 年前

    goto本身没有错。它在编程中是一个非常有用的构造,有许多有效的用途。想到的最好的方法是在C程序中释放结构化的资源。

        4
  •  32
  •   Ken Bloom    14 年前

    1968年, Edsger Dijkstra ACM通信 GOTO is considered harmful 在这篇文章中,他用 while循环 如果…那么…否则 条件句。当GOTO被用来代替这些控制结构时,结果往往是 spaghetti code . 几乎现在使用的每一种编程语言都是结构化的编程语言,GOTOs的使用也几乎被淘汰了。事实上,Java、Scala、Ruby和Python没有 goto

    C、C++和Perl仍然有GOTO命令,并且在某些情况下(特别是C) GOTO is useful ,例如,退出多个循环的break语句,或将清除代码集中到函数中的一个位置,即使有多种方法终止函数(例如,通过在函数过程中的多个点返回错误代码)。但一般来说,它的使用应该局限于特定的设计模式,这些模式以一种受控和公认的方式要求它。

    ScopeGuard (more) 而不是使用GOTO进行清理。但是GOTO是一个 frequently used idiom in the Linux kernel ( another source

    XKCD漫画是一个关于“当某些特定的设计模式被它的使用大大帮助时,GOTO是否应该总是被认为是有害的?”

        5
  •  9
  •   John Smith    16 年前

    你用谷歌搜索过这个问题吗?

    反goto运动的创始人是Edsger Dijskstra,他有着传奇性的“goto被认为是有害的”

    为了让你开始你可以去(哈哈!) http://en.wikipedia.org/wiki/GOTO

        6
  •  8
  •   Anonymous    6 年前

    在C++中是可能的,因为在C.,你是否应该使用它是可能的,是长期的宗教战争。

    这是C++的设计目标,在C语言中,99点C的程序应该用C++中的相同功能编译和运行。包括 goto