可能重复:
为什么使用goto不好?
GOTO仍被视为有害吗?
我通过xkcd进行了调整,看到了这个(几年前还读了一些关于它们的负面文章):
这究竟是什么问题?为什么goto甚至可以在C++中使用呢?
我为什么不使用它们?
Byr*_*ock 97
因为它们会导致意大利面条代码.
在过去,编程语言没有while()if()等,程序员使用goto来构成程序的逻辑.它导致了一个难以维护的混乱局面.
这就是CS众神创造函数条件和循环的原因.结构化编程在当时是一场革命.
goto适用于少数几个地方,例如跳出嵌套循环
bta*_*bta 62
goto
如果使用得当,没有任何问题.它是"禁忌"的原因是因为在C的早期阶段,程序员(通常来自装配背景)会goto
用来创建令人难以置信的难以理解的代码.
大多数时候,你可以没有生活,goto
也可以没事.但是,有一些情况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:
Run Code Online (Sandbox Code Playgroud)
使用a goto
跳出深度嵌套的循环通常比使用条件变量并在每个级别上检查它更清晰.
使用goto
来实现子程序是被滥用的主要途径.这产生了所谓的"意大利面条代码",其不必要地难以阅读和维护.
Jar*_*Par 31
goto本身没有任何问题.它在编程中是一个非常有用的结构,并且有许多有效的用途.想到的最好的是C程序中的结构化资源释放.
当goto出现问题时,他们会被滥用.滥用gotos可能导致完全不可读和无法维护的代码.
Ken*_*oom 24
1968年,Edsger Dijkstra给ACM GOTO的编辑写了一封着名的信,被认为是有害的,他用while循环和if ...... then ... else条件为结构化编程奠定了基础.当GOTO用于替代这些控制结构时,结果通常是意大利面条代码.几乎每种使用的编程语言都是结构化编程语言,并且几乎消除了GOTO的使用.事实上,Java,Scala,Ruby和Python根本没有goto
命令.
C,C++和Perl仍然有一个GOTO命令,有些情况(特别是在C中)GOTO很有用,例如一个退出多个循环的break语句,或者作为一种将清理代码集中在一个地方的方法即使有多种方法来终止函数(例如,通过在函数进程中的多个点返回错误代码),也可以使用函数.但一般来说,它的使用应限于以受控和公认的方式要求它的特定设计模式.
(在C++中,最好使用RAII或ScopeGuard (更多)而不是使用GOTO进行清理.但是GOTO是Linux内核中常用的习惯用法(另一个来源),这是惯用C代码的一个很好的例子.)
XKCD漫画是一个关于"如果某些特定的设计模式在使用时受到极大帮助,GOTO总是被视为有害的问题"的笑话吗?
你有问题吗?
反goto运动的创始人是Edsger Dijskstra,他的传奇故事是"Goto Considered Harmful"
为了帮助您入门,您可以转到(哈哈!)http://en.wikipedia.org/wiki/GOTO
这在C++中是可能的,因为它在C中是可能的.无论你是否应该使用它都是长期存在的宗教战争.
归档时间: |
|
查看次数: |
66283 次 |
最近记录: |