使用什么而不是Goto语句

What to use instead of Goto Statements?

本文关键字:Goto 语句 什么      更新时间:2023-10-16

我想知道应该使用什么而不是goto语句?

我应该使用嵌套的if/while/do-while语句吗?

他们说使用goto会创建"意大利面条代码",但如果有人正在编写一个大型控制台应用程序,并且他们有一个又一个if语句试图控制流,那肯定会一团糟吗?

我想问的是,很多人都在问,为什么后藤声明不好,但不是用什么来代替它。我相信很多初学者都能做到这一点。

这是针对C++的。

使用函数、循环和条件语句会更好。必要时使用break并继续。

我几乎可以向你保证,在任何情况下,你都会利用后藤,有更好的选择。有一个明显的例外:多级中断。

while(1){
    while(1){
        goto breakOut;
    }
    //more code here?
}
breakOut:

在这种(相对)罕见的情况下,goto可以用来代替典型的"break",以表明我们实际上正在摆脱嵌套循环。另一种方法是使用一个"完成"变量:

while(!done){
    while(!done){
        done = true;
        break;
    }
    if(done){break;}
    //More code here?  If so, the above line is important!
}

正如您所看到的,当您在外循环中有额外的处理时,done变量会更加详细,因此goto是一种更干净的释放方式!

然而,在99%的情况下,你真的,真的,不想开始写一堆goto语句。认真思考每一个。

对于函数,上述内容也可以这样写:

bool innerLoop(){
    while(1){
        return false;
    }
    return true;
}
...
while(innerLoop()){ //can only be written this way if the inner loop is the first thing that should run.
    //More code here?
}
...

有时,如果对外部循环有很多依赖关系,以这种方式打破内部循环可能会很混乱。但是,它仍然是一种可行的方法,可以通过return语句而不是goto或break来提前中断代码。

如果您可以使用干净、现代的构造来编写逻辑,那么就使用它。否则,如果goto有意义,就使用它吧。

一般来说,goto会使代码更难阅读,并遵循代码的流程。出于这个原因,新手被告知要完全避免goto。这鼓励他们从其他方面进行思考。

但有些人只是出于宗教信仰。编码不是宗教。如果一个goto有意义,C++就有一个完全有效的goto语句,当它有意义时,应该使用它。

问你应该用什么而不是goto对我来说是没有意义的。您通常可以使用某种类型的循环或其他构造,这取决于您正在执行的操作。但如果goto有意义,就使用它。

Don’不要听别人说"永远不要使用goto"。您说得很对,在某些情况下,嵌套作用域块会比goto更混乱。它有它的位置,就像switch/case一样然而,有了函数,你经常可以重构掉整个参数,让人们感到高兴。

只要忘记C++中有goto语句,就不会有关于如何替换goto的问题。:)

对于我来说,我从来没有看到过一个带有goto语句的代码,我可以称之为好代码。通常,goto语句是某些错误和困难的根源。尤其是修改这样的代码很困难。此外,一个goto语句通常开始在代码中生成其他goto语句。:)

goto很糟糕,因为它允许您从一个上下文跳到另一个上下文。上下文是程序特定点上所有变量(及其值)的矢量。程序执行图显示程序如何从上下文跳到上下文。保持执行图尽可能简单符合您的最大利益。最简单的是一个链,下一步是一个执行树。循环增加了复杂性,但它是管理的复杂性。如果您的执行图中有一个节点,它可以通过多个执行路径访问,并且您需要了解该节点的上下文,那么您需要遵循多个执行通路返回。这些"合并"节点大大增加了程序的复杂性。每个标记的语句(goto目标)都是一个潜在的合并节点。

因此,尽量不要使用goto运算符-语言本身将迫使您使用循环、布尔变量、类、函数等找到一个可管理的解决方案,这样您的程序将更加清晰易懂。C++异常是在上下文之间跳转的另一种可管理的方式。

有一些计算天才,他们可以记住并处理非常复杂的执行图,所以他们不太关心程序的复杂性,也不太关心下一个程序员,他们将被指派在未来支持或接管他们的代码。我想,我们这里有一些:-)