使用什么而不是Goto语句
What to use instead of Goto Statements?
我想知道应该使用什么而不是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++异常是在上下文之间跳转的另一种可管理的方式。
有一些计算天才,他们可以记住并处理非常复杂的执行图,所以他们不太关心程序的复杂性,也不太关心下一个程序员,他们将被指派在未来支持或接管他们的代码。我想,我们这里有一些:-)
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如何正确指定 goto 语句的标签?
- 使用 goto 语句C++块进行 python化
- 这是 c++ 中一个好的 goto 语句吗?
- 这段代码如何在没有任何循环语句或'goto'或递归的情况下循环?
- 如何在 lambda 表达式C++中使用 goto 语句
- C++ goto 语句执行而不调用
- 如何创建包含 goto 语句的主菜单函数
- 从嵌入式C/C++逻辑中去掉goto语句
- C++中goto语句对堆栈的影响
- 可以定义一个带有goto语句和标签的宏吗
- 替换goto语句
- 我如何用等价的结构化语句替换continue和goto语句
- 我应该在这里使用goto语句吗
- Java中有goto语句吗?
- 使用什么而不是Goto语句
- 多个返回语句或"goto end;"
- 与调用函数相比,goto语句效率高吗?