goto跳过代码而不调用析构函数和事物是真的吗?
例如
void f() {
int x = 0;
goto lol;
}
int main() {
f();
lol:
return 0;
}
Run Code Online (Sandbox Code Playgroud)
会不会x泄露?
目前我正在开发一个使用goto语句的项目.goto语句的主要目的是在例程中使用一个清理部分而不是多个return语句.如下所示:
BOOL foo()
{
BOOL bRetVal = FALSE;
int *p = NULL;
p = new int;
if (p == NULL)
{
cout<<" OOM \n";
goto Exit;
}
// Lot of code...
Exit:
if(p)
{
delete p;
p = NULL;
}
return bRetVal;
}
Run Code Online (Sandbox Code Playgroud)
这使得我们可以更容易地跟踪代码中一个部分的清理代码,即在Exit标签之后.
但是,我已经阅读了许多地方,有goto语句是不好的做法.
目前我正在阅读Code Complete书,它说我们需要使用接近其声明的变量.如果我们使用goto,那么我们需要在第一次使用goto之前声明/初始化所有变量,否则编译器会给出goto语句跳过xx变量初始化的错误.
哪条路对不对?
来自Scott的评论:
看起来使用goto从一个部分跳转到另一个部分是不好的,因为它使代码难以阅读和理解.
但是如果我们只使用goto前进到一个标签那么它应该没问题(?).
我自学了python 2.7.我有使用BATCH的经验,它有一个GOTO语句.我怎么在python中做到这一点?例如,假设我想从第5行跳到第18行.
我意识到之前有关于这个主题的问题,但我没有发现它们足够的信息,或者在我目前的理解中python级别太高.
我正在解决Project Euler上的问题9 .在我的解决方案中,我使用"goto"语句来打破两个for循环.问题如下:
毕达哥拉斯三元组是一组三个自然数,abc,为此,
a ^ 2 + b ^ 2 = c ^ 2
例如,3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 52.
恰好存在一个毕达哥拉斯三元组,其中a + b + c = 1000.找到产品abc.
我的解决方案是在c ++中:
int a,b,c;
const int sum = 1000;
int result = -1;
for (a = 1; a<sum; a++){
for (b = 1; b < sum; b++){
c = sum-a-b;
if (a*a+b*b == c*c){
result = a*b*c;
goto found;
}
} …Run Code Online (Sandbox Code Playgroud) 如果像我一样,你在一个While(True)循环的位置颤抖,那么你也必须经过长时间的努力思考重构它的最佳方法.我已经看到了几种不同的实现,没有一种比其他任何实现更好,例如timer和delegate组合.
那么你提出或看到重构可怕的While(True)循环的最佳方法是什么?
编辑:正如一些评论所提到的,我的意图是这个问题是一个"无限循环"重构,例如运行Windows风格的服务,其中唯一的停止条件是OnStop或致命异常.
我有一个程序,我需要打破一大堆嵌套for循环.到目前为止,大多数人告诉我这样做的方式是在我的代码中使用一个丑陋的goto.
现在,如果我创建一堆本地堆栈(我认为这就是它们被称为,如果不是,我的意思是只使用常规变量而不使用新命令)我的循环中的变量和我的程序命中一个if语句触发goto,我会遇到内存泄漏,因为我的程序不正确地退出许多循环并且没有清理局部变量?
我正在浏览网页并找到了这个例子.在public static void main方法中,这是我以前从未见过的行语法__main:
如:
public class Klass {
public static void main(String[] args) {
// code goes here...
__main:
// and mode code here...
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试将其打入eclipse并使用工具提示获得一个黄色下划线,其中说"标签__main从未明确引用".
我在网上找不到任何东西,我真的很好奇!我已经用Java编程多年了,我以前从未见过这种语法.它做了什么,你为什么要使用它,我在哪里可以学到更多?
在C++中,如果我希望代码调用一些不好的事情,我可以将代码放在析构函数或try-catch中.
在C中是否有类似的技术,如果程序意外终止,我可以调用特定的例程(清理资源)?
所以我已经看到很多情况,其中标签被用于for循环,特别是双嵌套循环.
这是唯一可以使用它们的情况吗?还是有其他我不知道的常见用途.我觉得它是一个我从未使用过的java工具!
现在大多数人不在goto他们的代码中使用语句。好的。在 SO 中,有许多线程在goto使用,所有线程都“允许”它退出深度循环。
展示一些:
我查看了cppreference.com,其中显示:
当无法使用其他语句将控制转移到所需位置时使用。
敲响我警钟的是“否则不可能”
goto任何机构都可以举出一些无法避免的例子吗?
注意:我将此问题标记为“C++”,只是因为我对 C++ 示例更感兴趣。任何其他语言对我都有好处。
goto ×6
c++ ×5
java ×2
c ×1
for-loop ×1
label ×1
loops ×1
memory-leaks ×1
notation ×1
python ×1
refactoring ×1
syntax ×1
while-loop ×1